2017-11-14 2 views
-1

Ich habe ein Python-Modul erstellt, um Wetterdaten (Breitengrad, Längengrad, Elevation und andere Details) zu generieren, indem bestimmte Orte als Eingabe genommen werden.Python Unit Test mit Doctest funktioniert nicht wie erwartet

Aktualisierte es wie Standards und "pycodestyle" Paket zur Überprüfung der PEP8 Standards wirft keine Fehler oder Warnungen.

My-Code ist unten angegeben:

def fetch_location_info(input_list, err_file): 

    # URL which gives us Latitude, Longitude values 
    LatLong_URL = (
    'http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=' 
    ) 

    # URL which gives us Elevation values 
    Elevation_URL = (
    'https://maps.googleapis.com/maps/api/elevation/json?locations=' 
    ) 

    # Initializing Error Logs with relevant title for writing error records 
    err_line_header = "Logging Location Data Errors" 
    print(err_line_header, file=err_file) 

    # Insert a new line in the error file after the Error Header 
    print("\n", file=err_file) 

    # Fetch and Extract Location details from google maps 
    input_info = [] 

    for location in input_list: 
     temp_info = {'Location': location} 
     latlong_response = requests.get(LatLong_URL + location).json() 

     if latlong_response.get('results'): 
      for latlong_results in latlong_response.get('results'): 
       latlong = (
        latlong_results 
        .get('geometry', '0') 
        .get('location', '0') 
        ) 

       temp_info['Latitude'] = latlong.get('lat', '0') 
       temp_info['Longitude'] = latlong.get('lng', '0') 

       elevation_response = requests.get(
        Elevation_URL 
        + str(temp_info['Latitude']) 
        + ',' 
        + str(temp_info['Longitude']) 
        ).json() 

       if elevation_response.get('results'): 
        for elevation_results in elevation_response.get('results'): 
         temp_info['Elevation'] = (
          elevation_results.get('elevation', '0')) 

         input_info.append(temp_info) 
         break 
       else: 
        print("Elevation_URL is not fetching values for {}" 
          .format(location), 
          file=err_file 
         ) 
       break 
     else: 
      print("LatLong_URL is not fetching values for {}" 
        .format(location), 
        file=err_file 
       ) 

    print("\n", file=err_file) 
    return input_info 

nun als nächster Schritt, ich versuche, Unit Testing mit doctest zu tun. Ich entschied mich, die Testfälle in einer separaten Datei zu behalten. Also habe ich folgende .txt Datei erstellt und im selben Verzeichnis wie der Code gespeichert.

This is a doctest based regression suite for Test_Weather.py 
Each '>>' line is run as if in a python shell, and counts as a test. 
The next line, if not '>>' is the expected output of the previous line. 
If anything doesn't match exactly (including trailing spaces), the test fails. 

>>> from Test_Weather import fetch_location_info 
>>> fetch_location_info(["Sydney,Australia"], open('data/error_log.txt', 'w')) 
print(input_info) 

Wie oben zu sehen ist, sollte der erwartete Zustand zurück den Inhalt der Liste/Datenrahmen/Variable, die erstellt wird innerhalb der Funktion geprüft wird. Für einen Versuch habe ich versucht, da der erwartete Wert den Inhalt der Liste, aber meine Unit-Test-Ausgabe wirft Fehler wie unten nur zu drucken und bekam Wert passend nicht:

PS C: \ Benutzer \ JKC> Python -m doctest testcases.txt ******************************************** *************************** Datei "testcases.txt", Zeile 7, in testcases.txt Fehlgeschlagenes Beispiel: fetch_location_info (["Sydney , Australien "], open ('data/error_log.txt', 'w'))

Erwartet:

print(input_info) 

Got:

[{'Location': 'Sydney,Australia', 'Latitude': -33.8688197, 'Longitude': 151. 2092955, 'Elevation': 24.5399284362793}] 

Also hier, wie Sie, dass der Test Case funktionierte gut sehen können, aber da ich nicht in der Lage bin, den Inhalt der Liste zu drucken, es ist der Testfall fehlgeschlagen.

Meine Frage ist Wie kann ich den Inhalt der Liste im erwarteten Abschnitt der Einheit Testfall anzeigen?

Wenn ich nicht falsch liege, muss ich den Ausgangswert im erwarteten Abschnitt des Unit-Testfalls wörtlich erwähnen?

Alle Eingänge werden hilfreich sein

+0

Ihr Testfall ist der wörtlichen Text erwarten 'print (input_info) '. – user2357112

+0

Danke für Ihre Antwort @ user2357112 Das ist, wo ich geschlagen wurde. Ich habe den Testfall geschrieben, um den Inhalt der input_info-Liste zu drucken, aber es druckt den Inhalt nicht. Wie drucke ich die Inhalte? Irgendwelche Zeiger? – JKC

+0

Bitte werfen Sie einen Blick auf den Inhalt der Unit Test-Falldatei für mehr Klarheit. Ich habe die Frage aktualisiert, um mehr Lesbarkeit zu haben – JKC

Antwort

1

Sie müssen die doctest haben genauso aussehen, als ob Sie es an dem Python REPL laufen:

>>> from Test_Weather import fetch_location_info 
>>> fetch_location_info(["Sydney,Australia"], open('data/error_log.txt', 'w')) 
[{'Location': 'Sydney,Australia', 'Latitude': -33.8688197, 'Longitude': 151.2092955, 'Elevation': 24.5399284362793}] 
+0

Dank @Mark Tolonen für Ihre Antwort.Also muss ich den Ausgabewert für den Eingabewert, den ich im Testfall gebe, manuell erfassen und im Testfall gleich erwähnen. Ist das richtig ? – JKC

+1

Ja. Führen Sie Ihren Code grundsätzlich vom Interpreter aus und erfassen Sie das Ergebnis (sofern es korrekt ist). Oder, wenn Sie nach dem Best Practice-Test und dem Schreiben von Tests vor dem Generieren von Code manuell schreiben, wie Ihr Code beim Interpreter funktionieren soll und welche Ausgabe er generiert, machen Sie Ihren Code dazu, dass der Test bestanden wird. –

+0

Großartig. Vielen Dank. Noch ein Zweifel. Ich übergebe Datumswert als eine der Eingaben zu einer Funktion. Wenn ich also versuche, datetime.datetime (2017, 6, 1) als einen Eingabewert für eine Funktion im Unit-Testfall zu erwähnen, wird ein Fehler ausgegeben, der besagt, dass "datetime nicht definiert" ist. Das heißt, muss ich die ">>> import datetime" -Anweisung vor die Funktionsaufrufzeile in meinem Unit-Testfall einfügen? – JKC