Überprüfen Sie die Python-Abdeckung mit pytest-cov

Einführung

Zuvor fasst zusammen, wie ein Flaschentest mit Python-Pytest durchgeführt wird. Der Unit-Test ist ein guter Test (Garagentest) unter dem Gesichtspunkt, ob der Verarbeitungsweg und die Verzweigungsbedingungen abgedeckt sind. Hier ist eine Zusammenfassung der Verwendung einer Bibliothek namens "pytest-cov", die bestimmt, wie umfassend sie ist.

Umgebung

Installation

--Installieren Sie pytest mit `pip install pytest```. --Installieren Sie pytest-cov mit `pip install pytest-cov```.

Was Sie brauchen, um die Abdeckung mit pytest-cov zu sehen

Da pytest-cov auf pytest basiert, ist eine Umgebung (zu testende Quelle und Testquelle) erforderlich, in der pytest ausgeführt werden kann. Für pytest-cov wird nichts benötigt. Informationen zur Verwendung von pytest finden Sie unter Komponententest des Kolbens mit pytest.

Überprüfen der Hebelwirkung eines einfachen Funktionseinheitentests

Wir werden sehen, wie man pytest-cov mit einer einfachen Funktion verwendet, die beim Zusammenfassen des Komponententests ähnelt.

Quelle getestet werden

Verwenden Sie die Quelle mit einer if-Anweisung im Beispiel Beim Zusammenfassen von Komponententests, um den Zweig zu überprüfen.

testing_mod.py


def add_calc(a, b):
    if (a == 1):
        b = b + 1
    return a + b

Quelle, die die Testmethode beschreibt

Dies entspricht beim Zusammenfassen des Komponententests.

py_test_main.py



import pytest
import testing_mod

def test_ok_sample():
    result = testing_mod.add_calc(1, 2)
    assert 4 == result

Unit-Test ausführen

Nachdem Sie die Quelle des Testziels und der Testmethode gefunden haben, führen Sie diese aus. Die Ausführungsmethode unterscheidet sich geringfügig, je nachdem, ob der Test den Verarbeitungsweg oder den bedingten Zweig abdecken soll.

Durchführung eines Unit-Tests, der den Verarbeitungsweg abdeckt

Sie können die Abdeckungstestrate (C0-Abdeckung) der Verarbeitungsroute anzeigen, indem Sie beim Ausführen von pytest die Option `` `--cov``` hinzufügen.

# pytest --cov -v py_test_main.py

~~~~ Abkürzung ~~~~~

py_test_main.py::test_ok_sample PASSED                        [100%] 

----------- coverage: platform win32, python 3.6.5-final-0 -----------
Name              Stmts   Miss  Cover
-------------------------------------
py_test_main.py       5      0   100%
testing_mod.py        4      0   100%
-------------------------------------
TOTAL                 9      0   100%

====== 1 passed in 0.05s ======

Wenn Sie sich das Ergebnis ansehen, sehen Sie, dass die Abdeckung von test_mod.py im Test 100% beträgt und alle Verarbeitungsrouten bestanden wurden. Stmts ist übrigens die Anzahl der Verarbeitungszeilen, die während des Tests bestanden wurden, und Miss ist die Anzahl der Verarbeitungszeilen, die während des Tests nicht bestanden wurden.

Einzelne Testausführung für bedingte Verzweigung

Sie können die Abdeckungstestrate (C1-Abdeckung) der bedingten Verzweigung anzeigen, indem Sie beim Ausführen von pytest die Option `--cov --cov-branch `hinzufügen.

# pytest --cov --cov-branch -v py_test_main.py

~~~~ Abkürzung ~~~~~

py_test_main.py::test_ok_sample PASSED                           [100%] 

----------- coverage: platform win32, python 3.6.5-final-0 -----------
Name              Stmts   Miss Branch BrPart  Cover
---------------------------------------------------
py_test_main.py       5      0      0      0   100%
testing_mod.py        4      0      2      1    83%
---------------------------------------------------
TOTAL                 9      0      2      1    91%

====== 1 passed in 0.08s ======

Im Gegensatz zu früher nehmen Branch und BrPart zu. Dieses Mal beträgt testing_mod.py 83%, da nur die Bedingungen getestet werden, die in die if-Anweisung eingegeben werden. Branch ist übrigens die Anzahl der bedingten Verzweigungen, und BrPart ist die Anzahl der Bedingungen, die nicht erfüllt werden. In diesem Beispiel hat Branch zwei Muster, eine Bedingung, die die if-Anweisung eingibt, und eine Bedingung, die die if-Anweisung nicht eingibt, und ein Muster von BrPart wird angezeigt, da die Bedingung, die die if-Anweisung nicht eingibt, nicht getestet wurde.

Testquelle hinzufügen

Fügen Sie einen Test hinzu, um den Zweig zu 100% zu machen.

py_test_main.py



import pytest
import testing_mod

def test_ok_sample():
    result = testing_mod.add_calc(1, 2)
    assert 4 == result

def test_ok_not_if_sample():
    result = testing_mod.add_calc(2, 2)
    assert 4 == result

Lauf

Versuchen Sie es erneut, um festzustellen, ob der Zweig 100% ist.

# pytest --cov --cov-branch -v py_test_main.py

~~~~ Abkürzung ~~~~~

py_test_main.py::test_ok_sample PASSED                             [ 50%] 
py_test_main.py::test_ok_not_if_sample PASSED                      [100%] 

----------- coverage: platform win32, python 3.6.5-final-0 -----------
Name              Stmts   Miss Branch BrPart  Cover
---------------------------------------------------
py_test_main.py       8      0      0      0   100%
testing_mod.py        4      0      2      0   100%
---------------------------------------------------
TOTAL                12      0      2      0   100%

====== 1 passed in 0.08s ======

Mit Blick auf das Ergebnis betrug die Deckung 100% und BrPart 0.

abschließend

Die Abdeckung ist ein guter Weg, um Fehler zu reduzieren, da sie sehr einfach und mechanisch durchdacht ist. Einige Leute betrachten die Abdeckung jedoch als absolut, was zu Testauslassungen und unnötig erhöhtem Testaufwand führt. Beispiel: "Die Kombination von Bedingung 1 und der folgenden Bedingung 2 ist seltsam und ich habe den Fehler verpasst, aber die Abdeckung war in Ordnung" oder "Um den Ausnahmeerstellungsprozess (für alle SQL) zu bestehen, der durch den DB-Verbindungsfehler 1 verursacht wurde Es hat eine Woche gedauert. " Auf der anderen Seite handelt es sich um eine sehr effektive Bibliothek, da Sie Bedingungen finden können, die häufig übersehen werden, z. B. Bedingungen, die nicht wie in diesem Beispiel in der if-Anweisung enthalten sind. Persönlich denke ich, dass es besser wäre, es als Hilfsmittel zu verwenden, das zuerst die Abdeckung betrachtet, die Bedingungen analysiert und dann überlegt, ob es einen Test gibt oder nicht.

Recommended Posts

Überprüfen Sie die Python-Abdeckung mit pytest-cov
Domaincheck mit Python
Überprüfen Sie die Version mit Python
Anzeigen der Kolbenabdeckung mit pytest-cov
FizzBuzz in Python3
Scraping mit Python
[Python] Einfache Überprüfung des Argumenttyps mit Datenklasse
Statistik mit Python
Scraping mit Python
Python mit Go
Überprüfen Sie die Existenz der Datei mit Python
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Überprüfen Sie die Aktienkurse mit Slackbot mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Lesen Sie Daten mit python / netCDF> nc.variables [] / Überprüfen Sie die Datengröße
Überprüfen Sie Python-Skripte automatisch mit GitHub + Travis-CI + Pycodestyle
Überprüfen Sie das Datum der Flaggenpflicht mit Python
Serielle Kommunikation mit Python
Zip, entpacken mit Python
Django 1.11 wurde mit Python3.6 gestartet
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Python lernen mit ChemTHEATER 03
Sequentielle Suche mit Python
"Objektorientiert" mit Python gelernt
Führen Sie Python mit VBA aus
Umgang mit Yaml mit Python
Löse AtCoder 167 mit Python
Serielle Kommunikation mit Python
[Python] Verwenden Sie JSON mit Python
Python lernen mit ChemTHEATER 05-1
Lerne Python mit ChemTHEATER
1.1 Erste Schritte mit Python
Binarisierung mit OpenCV / Python
3. 3. KI-Programmierung mit Python
Kernel-Methode mit Python
Nicht blockierend mit Python + uWSGI
Scraping mit Python + PhantomJS
Tweets mit Python posten
Fahren Sie WebDriver mit Python
Verwenden Sie Mecab mit Python 3
[Python] Mit CGIHTTPServer umleiten
Sprachanalyse mit Python
Denken Sie an Yaml mit Python
Kinesis mit Python betreiben
Erste Schritte mit Python
Verwenden Sie DynamoDB mit Python