Vérifiez la couverture de python avec pytest-cov

introduction

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.

environnement

Installation

--Installez pytest avec pip install pytest```. --Installez pytest-cov avec `` pip install pytest-cov ''.

Ce dont vous avez besoin pour voir la couverture avec 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.

Vérification de l'effet de levier d'un simple test d'unité fonctionnelle

Nous verrons comment utiliser pytest-cov via une fonction simple similaire à Lors de la synthèse du test unitaire.

Source à tester

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

Source qui décrit la méthode de test

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

Exécuter un test unitaire

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.

Exécution d'un test unitaire couvrant l'itinéraire de traitement

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.

Exécution de test unique couvrant le branchement conditionnel

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.

Ajouter une source de test

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

Courir

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.

en conclusion

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

Vérifiez la couverture de python avec pytest-cov
Vérification de domaine avec Python
Vérifier la version avec python
Voir la couverture du flacon avec pytest-cov
FizzBuzz en Python3
Grattage avec Python
[Python] Vérification simple du type d'argument avec la classe de données
Statistiques avec python
Grattage avec Python
Python avec Go
Vérifier l'existence du fichier avec python
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Vérifiez les cours des actions avec Slackbot en utilisant Python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Lire les données avec python / netCDF> nc.variables [] / Vérifier la taille des données
Vérifier automatiquement les scripts Python avec GitHub + Travis-CI + pycodestyle
Vérifiez la date du devoir de drapeau avec Python
Communication série avec Python
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
1.1 Premiers pas avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
Publier des tweets avec python
Conduisez WebDriver avec python
Utiliser mecab avec Python 3
[Python] Redirection avec CGIHTTPServer
Analyse vocale par python
Pensez à yaml avec python
Utiliser Kinesis avec Python
Premiers pas avec Python
Utiliser DynamoDB avec Python