2016-04-09 6 views
9

Ich habe gerade begonnen, Coverage.py Modul zu verwenden und so beschlossen, einen einfachen Test zu machen, um zu überprüfen, wie es funktioniert.Wie benutze ich coverage.py in Python?

Sample.py

def sum(num1, num2): 
    return num1 + num2 


def sum_only_positive(num1, num2): 
    if num1 > 0 and num2 > 0: 
     return num1 + num2 
    else: 
     return None 

test.py

from sample import sum, sum_only_positive 

def test_sum(): 
    assert sum(5, 5) == 10 

def test_sum_positive_ok(): 
    assert sum_only_positive(2, 2) == 4 

def test_sum_positive_fail(): 
    assert sum_only_positive(-1, 2) is None 

Wie Sie sehen, alle meine Code mit Tests abgedeckt und py.test sagt sie alle passieren. Ich erwarte, dass Coverage.py eine 100% ige Abdeckung anzeigt. Nun, nein.

Coverage.py results

Nun, Coverage.py nicht test.py-Datei, so dass ich kopiert Testfunktionen zu sample.py Datei und lief wieder Reichweite:
enter image description here

Dann habe ich diesen Code-Block:

if __name__ == "__main__": 
    print(sum(2, 4)) 
    print(sum_only_positive(2, 4)) 
    print(sum_only_positive(-1, 3)) 

und alle Testfunktionen entfernt. Danach zeigt Coverage.py 100%:

enter image description here

Warum ist es so? Sollte Coverage.py keine Testabdeckung zeigen, nicht nur die Ausführungsabdeckung? Ich habe eine offizielle F.A.Q. für Coverage.py gelesen, kann aber keine Lösung finden.
Da viele SO-Benutzer mit Code-Tests und Code-Coverage vertraut sind, hoffe ich, dass Sie mir sagen können, wo ich mich irre.

Ich habe nur einen Gedanken hier: Coverage.py kann einfach beobachten, welche Zeilen des Codes nicht ausgeführt werden, also sollte ich Tests für diese Zeilen schreiben. Aber es gibt Linien, die bereits ausgeführt werden, aber nicht mit Tests abgedeckt sind, so dass Coverage.py hier fehlschlägt.

+0

Wie rufen Sie Coverage/Pytest? –

+0

@Rogalski pytest: 'python -m py.test test.py' und Coverage:' python -m coverage run sample.py' (unter Windows) – Groosha

Antwort

7

Coverage sucht eine .coverage Datei diesen Bericht für Sie zu lesen und zu generieren. Py.test alleine erzeugt keinen einzigen. Sie müssen py.test Plugin für die Berichterstattung:

pip install pytest-cov 

Wenn Sie bereits haben, dann können Sie beide auf einmal wie folgt ausführen:

py.test test.py --cov=sample.py 

Was bedeutet, laufen Testmodul test.py und Aufzeichnung/Anzeige Abdeckung Bericht über sample.py.

Wenn Sie mehrere Testläufe haben müssen und ihre aufgezeichnet Abdeckung ansammeln und dann einen Abschlussbericht anzeigen, können Sie es wie folgt aus:

py.test test.py --cov=sample.py --cov-report= 
py.test test.py --cov=sample2.py --cov-report= 
py.test test.py --cov=sample3.py --cov-report= 

Welche Testmodul test.py und Rekord laufen Mittel (nur) Berichterstattung unter sample.py - zeige keinen Bericht an.

Jetzt können Sie Abdeckung Befehl separat für einen vollständigen Bericht ausgeführt:

coverage report -m 

Der obige Befehl zeigt einfach eine formatierte Abdeckung Bericht basierend auf der akkumulierten .coverage Datendatei von vorherigen Testläufen. -m bedeutet Linien anzeigen d.h. Linien verfehlt nicht durch Tests abgedeckt:

Name  Stmts Miss Cover Missing 
----------------------------------------- 
sample.py  6  0 100% 

Coverage mehr Schalter wie --include und --omit auf/Ausschluss von Dateien mit Pfadmuster unterstützt. Weitere Informationen finden Sie in der Dokumentation: http://coverage.readthedocs.org/en/coverage-4.0.3/cmd.html#reporting

+0

Es hat funktioniert. Vielen Dank! – Groosha

+0

Funktioniert nicht, wenn die zu untersuchende Datei ein Submodul in einem Paket ist, das im Test importiert wird. -cov = <> '- nur der Dateiname, relativ E oder absoluter Pfad - ich bekomme "FEHLER: Fehler beim Erstellen des Berichts: Keine Daten zum Bericht." –

+0

Angabe des vollqualifizierten Modulnamens funktioniert. –

6

Es ist ein wenig schwierig, durch Ihre Experimente zu analysieren, und Sie haben die Befehlszeilen, die Sie mit jedem Experiment verwendeten, nicht enthalten. Aber: Wenn Sie die Tests mit laufen:

python -m py.test test.py 

dann können Sie sie unter coverage.py laufen mit:

coverage run -m py.test test.py 
+0

Übrigens, ich habe Befehle eingefügt, die nur zum Ausführen von Tests und zur Abdeckung verwendet werden unter meinem Post im zweiten Kommentar: pytest: 'python -m py.test test.py' und coverage:' python -m coverage starte sample.py' (unter Windows). Ich sehe deinen zweiten Befehl unterscheidet sich von meinem, wird dies überprüfen, danke! – Groosha

+1

Vielleicht ist das Problem hier ein grundlegendes Missverständnis: Sie sollten nicht die Tests und dann Abdeckung durchführen. Sie sollten Coverage verwenden, um Ihre Tests auszuführen (so wie ich es empfehle), oder die Coverage während der Ausführung von Tests aktivieren (z. B. mit einem Coverage-Plug-in für Test-Runner). –

+0

Funktioniert nicht für mich :('coverage -m' ->' Keine solche Option -m'. Coverage run py.test test.py' -> 'Unbekannter Befehl py.test' (py.test ist installiert) – Groosha