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.
--Installieren Sie pytest mit `pip install pytest```. --Installieren Sie pytest-cov mit
`pip install pytest-cov```.
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.
Wir werden sehen, wie man pytest-cov mit einer einfachen Funktion verwendet, die beim Zusammenfassen des Komponententests ähnelt.
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
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
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.
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.
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.
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
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.
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