2017-05-05 1 views
0

Ich bin ein Apache-Log-Parsing-Skript zu schreiben, die diese AusgabePytest Fehler mit Wörterbuch Ausgang

'remote_host': '192.168.0.1', 'apache_status': '403', 'data_transfer': '3985' 

Nun kehren dieses Skript zu testen Ich schreibe Unittest pytest mit

import logparsing_apache 
def test_final_report(): 
    output = logparsing_apache.final_report('192.168.0.1 - - [23/Apr/2017:05:54:36 -0400] "GET/HTTP/1.1" 403 3985 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"') 
assert output == "'remote_host': '192.168.0.1', 'apache_status': '403', 'data_transfer': '3985'" 

Während dieses Skript ausgeführt wird, seine Fehler mit diesem Fehler

test_logparsing_apache.py:4: 
logparsing_apache.py:25: in final_report 
line_dict = apache_output(line) 
line = '1' 
def apache_output(line): 
    split_line = line.split() 
    return {'remote_host': split_line[0], 
  'apache_status': split_line[8], 
      'data_transfer': split_line[9], 
    } 
E  IndexError: list index out of range 
logparsing_apache.py:18: IndexError 

1 failed, in 0.03 seconds 

Als meine Skript Rückkehr Wörterbuch, wie seine Ausgabe zu überprüfen, behaupten mit?

Script:

import sys 

def apache_output(line): 
    split_line = line.split() 
    return {'remote_host': split_line[0], 
      'apache_status': split_line[8], 
      'data_transfer': split_line[9], 
    } 


def final_report(logfile): 
    for line in logfile: 
     line_dict = apache_output(line) 
     print(line_dict) 


if __name__ == "__main__": 
    if not len(sys.argv) > 1: 
     print (__doc__) 
     sys.exit(1) 
    infile_name = sys.argv[1] 
    try: 
     infile = open(infile_name, 'r') 
    except IOError: 
     print ("You must specify a valid file to parse") 
     print (__doc__) 
     sys.exit(1) 
    log_report = final_report(infile) 
    print (log_report) 
    infile.close() 
+0

Siehe https://docs.pytest.org/en/latest/ assert.html # assertions-about-expected-exceptions –

+1

Mögliches Duplikat von [Wie man richtig behauptet, dass eine Ausnahme in pytest ausgelöst wird?] (http://stackoverflow.com/questions/23337471/how-to-properly-assert-) that-a-exception-ruft-raiste-in-pytest) –

+1

Ihr Fehler und Ihre Frage haben nichts miteinander zu tun – jordanm

Antwort

0

Der Grund für Fehler ist, weil Ihre final_report Funktion ein Dateiobjekt erwartet, keinen String. Aus diesem Grund endet Ihre Funktion über jedes Zeichen in der Zeichenfolge. Was am Ende an apache_output übergeben wird, ist die Zeichenfolge "1".

Sie können Ihre aktuelle Ausnahme beheben, indem Sie eine Liste anstelle einer Zeichenfolge in Ihrem Test bestanden:

output = logparsing_apache.final_report(['192.168.0.1 - - [23/Apr/2017:05:54:36 -0400] "GET/HTTP/1.1" 403 3985 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"']) 

Wenn Sie möchten, können Sie auch die mock Bibliothek verwenden stattdessen eine dateiähnliche Objekt zu erstellen.

Für Ihren Vergleich können Sie Wörterbücher sind gleich, aber Sie müssen behaupten tatsächlich, um es ein Wörterbuch anstelle eines string:

assert output == {'remote_host': '192.168.0.1', 'apache_status': '403', 'data_transfer': '3985'} 
+0

Nebenbei bemerkt, Sie sind wahrscheinlich besser dran mit einer vorhandenen Bibliothek zum Parsen der Protokollzeilen: https: //pypi.python .org/pypi/apache-log-parser/1.6.2 – jordanm