J'expliquerai comment amener Jenkins à faire des tests unitaires en développement en utilisant Python. Nose ou py.test sont des candidats pour le framework de test unitaire de Python. Cette fois, nous utiliserons py.test.
À Jenkins
L'environnement est le suivant.
article | Version etc. |
---|---|
Python | 3.5.1 |
Jenkins | 1.6...? |
Cadre de test | py.test |
py.test
Installer avec pip install pytest
Code à tester --carticer.py
class Calculator():
def add(self, a, b):
return a + b
def sub(self, a, b):
return a - b
def mul(self, a, b):
return a * b
def div(self, a, b):
return a / b
Code de test --test_calculator.py
import pytest
from calculator import Calculator
def pytest_funcarg__calc():
return Calculator()
@pytest.mark.parametrize("a, b, r", [(9, 8, 17), (7, 6, 13), (5, 4, 9), (3, 2, 5), (1, 0, 1)])
def test_add(calc, a, b, r):
assert calc.add(a, b) == r
@pytest.mark.parametrize("a, b, r", [(9, 8, 1), (7, 6, 1), (5, 4, 1), (3, 2, 1), (1, 0, 1)])
def test_sub(calc, a, b, r):
assert calc.sub(a, b) == r
@pytest.mark.parametrize("a, b, r", [(9, 8, 72), (7, 6, 42), (5, 4, 20), (3, 2, 6), (1, 0, 0)])
def test_mul(calc, a, b, r):
assert calc.mul(a, b) == r
@pytest.mark.parametrize("a, b, r", [(9, 3, 3), (8, 4, 2), (6, 2, 3), (4, 2, 2), (0, 1, 0)])
def test_div(calc, a, b, r):
assert calc.div(a, b) == r
def test_div_error(calc):
with pytest.raises(ZeroDivisionError):
calc.div(1, 0)
Peut être exécuté avec py.test
Recherche récursive sous le répertoire exécuté
Il exécutera le fichier py qui commence par test.
résultats de test Succès
============================= test session starts ==============================
platform darwin -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /Users/rotasuke/git/python_test/others, inifile:
collected 21 items
test_calculator.py .....................
========================== 21 passed in 0.03 seconds ===========================
Exemple d'échec
============================= test session starts ==============================
platform darwin -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /Users/rotasuke/git/python_test/others, inifile:
collected 21 items
test_calculator.py ...................F.
=================================== FAILURES ===================================
_______________________________ test_div[0-1-1] ________________________________
calc = <calculator.Calculator object at 0x10c9567f0>, a = 0, b = 1, r = 1
@pytest.mark.parametrize("a, b, r", [(9, 3, 3), (8, 4, 2), (6, 2, 3), (4, 2, 2), (0, 1, 1)])
def test_div(calc, a, b, r):
> assert calc.div(a, b) == r
E assert 0.0 == 1
E + where 0.0 = <bound method Calculator.div of <calculator.Calculator object at 0x10c9567f0>>(0, 1)
E + where <bound method Calculator.div of <calculator.Calculator object at 0x10c9567f0>> = <calculator.Calculator object at 0x10c9567f0>.div
test_calculator.py:21: AssertionError
===================== 1 failed, 20 passed in 0.04 seconds ======================
Les paramètres détaillés tels que le contrôle Git sont omis.
Dans [Build] - [Run Shell]
py.test <répertoire à exécuter>
Spécifier.
Dans le script shell à exécuter que vous avez entré précédemment
--junitxml = <fichier xml de destination>
En spécifiant, le rapport de test peut être édité au format JUnit.
Ajout de [Résultats de test JUnit agrégés] au [Traitement post-build] Spécifiez le fichier xml qui a été généré précédemment.
Installez le module pour la sortie de couverture avec pip install pytest-cov
Dans le script shell à exécuter que vous avez entré précédemment
--cov-report=xml --cov
En spécifiant, coverage.xml peut être sorti sous le répertoire où la commande est exécutée.
Il peut être visualisé en demandant au plugin Cobertura de Jenkins de lire coverage.xml.
Recommended Posts