Ich werde erklären, wie Jenkins dazu gebracht wird, Unit-Tests in der Entwicklung mit Python durchzuführen. Nose oder py.test sind Kandidaten für das Unit-Test-Framework von Python. Dieses Mal werden wir py.test verwenden.
Zu Jenkins
Die Umgebung ist wie folgt.
Artikel | Version etc. |
---|---|
Python | 3.5.1 |
Jenkins | 1.6...? |
Test-Framework | py.test |
py.test
Installieren Sie mit pip install pytest
Zu testender Code --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
Testcode --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)
Kann mit py.test
ausgeführt werden
Rekursiv unter dem ausgeführten Verzeichnis suchen
Es wird die py-Datei ausgeführt, die mit dem Test beginnt.
Testergebnisse Erfolgsgeschichte
============================= 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 ===========================
Fehlerbeispiel
============================= 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 ======================
Detaillierte Einstellungen wie Git Checkout werden weggelassen.
In [Build] - [Shell ausführen]
py.test <Verzeichnis zum Ausführen>
Konkretisieren.
In dem auszuführenden Shell-Skript, das Sie zuvor eingegeben haben
--junitxml = <Zielxml-Datei>>
Durch Angabe kann der Testbericht im JUnit-Format ausgegeben werden.
[Aggregate JUnit-Testergebnisse] zu [Post-Build-Verarbeitung] hinzugefügt Geben Sie die XML-Datei an, die zuvor ausgegeben wurde.
Installieren Sie das Modul für die Abdeckungsausgabe mit pip install pytest-cov
In dem auszuführenden Shell-Skript, das Sie zuvor eingegeben haben
--cov-report=xml --cov
Durch Angabe kann Coverage.xml in dem Verzeichnis ausgegeben werden, in dem der Befehl ausgeführt wird.
Dies kann visualisiert werden, indem das Cobertura-Plugin von Jenkins die Datei cover.xml liest.
Recommended Posts