Précédemment résume comment faire un test unitaire de flask en utilisant le pytest de python.
Le test unitaire est un bon test (test de garage) du point de vue de savoir si l'itinéraire de traitement et les conditions de branchement sont couverts. Voici un résumé de la façon d'utiliser une bibliothèque appelée
pytest-cov '' '' qui détermine le degré de couverture.
--Installez pytest avec
pip install pytest```.
--Installez pytest-cov avec `` pip install pytest-cov ''.
Comme pytest-cov fonctionne sur la base de pytest, un environnement (source à tester et source de test) dans lequel pytest peut être exécuté est requis. Rien n'est nécessaire pour pytest-cov. Pour savoir comment utiliser pytest, voir Test unitaire de flacon avec pytest.
Nous verrons comment utiliser pytest-cov via une fonction simple similaire à Lors de la synthèse du test unitaire.
Utilisez la source avec une instruction if dans l'exemple Lors de la synthèse des tests unitaires pour vérifier la branche.
testing_mod.py
def add_calc(a, b):
if (a == 1):
b = b + 1
return a + b
C'est la même chose que Lors de la synthèse du test unitaire.
py_test_main.py
import pytest
import testing_mod
def test_ok_sample():
result = testing_mod.add_calc(1, 2)
assert 4 == result
Maintenant que vous avez la source de la cible de test et de la méthode de test, exécutez-la. La méthode d'exécution diffère légèrement selon que le test doit couvrir la voie de traitement ou la branche conditionnelle.
Vous pouvez voir le taux de test de couverture (couverture C0) de l'itinéraire de traitement en ajoutant l'option `` --cov``` lors de l'exécution de pytest.
# pytest --cov -v py_test_main.py
~~~~ Abréviation ~~~~~
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 ======
En regardant le résultat, vous pouvez voir que la couverture de testing_mod.py sous test est de 100% et que toutes les routes de traitement ont réussi. À propos, Stmts est le nombre de lignes de traitement qui ont réussi pendant le test, et Miss est le nombre de lignes de traitement qui n'ont pas réussi pendant le test.
Vous pouvez voir le taux de test de couverture (couverture C1) du branchement conditionnel en ajoutant l'option
--cov --cov-branch` `` lors de l'exécution de pytest.
# pytest --cov --cov-branch -v py_test_main.py
~~~~ Abréviation ~~~~~
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 ======
En regardant les résultats, contrairement à avant, Branch et BrPart augmentent. Cette fois, testing_mod.py est de 83% car nous testons uniquement les conditions qui entrent dans l'instruction if. À propos, Branch est le nombre de branches conditionnelles et BrPart est le nombre de conditions qui ne passent pas. Dans cet exemple, Branch a deux modèles, une condition qui entre l'instruction if et une condition qui n'entre pas l'instruction if, et un modèle de BrPart apparaît car la condition qui n'entre pas l'instruction if n'a pas été testée.
Ajoutez un test pour rendre la branche à 100%.
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
Essayez de l'exécuter à nouveau pour voir si la branche est à 100%.
# pytest --cov --cov-branch -v py_test_main.py
~~~~ Abréviation ~~~~~
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 ======
En regardant le résultat, la couverture était de 100% et BrPart était de 0.
La couverture est un bon moyen de réduire les bugs car elle est très simple et pensée mécaniquement. Cependant, certaines personnes considèrent la couverture comme absolue, ce qui peut entraîner des omissions de test et un gaspillage d'efforts de test. Par exemple, «La combinaison de la condition 1 et de la condition 2 suivante est étrange et j'ai manqué le bogue, mais la couverture était correcte» ou «Pour passer le processus de création d'exception (pour tous les SQL) causé par l'erreur de connexion à la base de données 1 Cela a pris une semaine. " D'autre part, c'est une bibliothèque très efficace car vous pouvez trouver des conditions qui sont souvent négligées, telles que des conditions qui ne sont pas incluses dans l'instruction if comme dans cet exemple. Personnellement, je pense qu'il serait préférable de l'utiliser comme un outil auxiliaire qui examine d'abord la couverture, analyse les conditions, puis considère s'il y a ou non un test.
Recommended Posts