UnitTest Framework - moduł Py.test
W 2004 roku Holger Krekel zmienił nazwę swojego stdpakiet, którego nazwa była często mylona z nazwą biblioteki standardowej dostarczanej z Pythonem, do (tylko nieco mniej mylącej) nazwy „py”. Chociaż pakiet zawiera kilka pakietów podrzędnych, jest obecnie prawie całkowicie znany ze swojego frameworka py.test.
Framework py.test ustanowił nowy standard testowania w Pythonie i stał się obecnie bardzo popularny wśród wielu programistów. Eleganckie i Pythonic idiomy, które wprowadził do pisania testów, umożliwiły pisanie zestawów testów w znacznie bardziej zwartym stylu.
py.test to niekodowana alternatywa dla standardowego modułu unittest w Pythonie. Pomimo tego, że jest w pełni funkcjonalnym i rozszerzalnym narzędziem testowym, oferuje prostą składnię. Tworzenie zestawu testów jest tak proste, jak napisanie modułu z kilkoma funkcjami.
py.test działa na wszystkich systemach operacyjnych POSIX i WINDOWS (XP / 7/8) z wersjami Pythona 2.6 i nowszymi.
Instalacja
Użyj poniższego kodu, aby załadować moduł pytest w bieżącej dystrybucji języka Python oraz narzędzie py.test.exe. Testy można przeprowadzać przy użyciu obu.
pip install pytest
Stosowanie
Możesz po prostu użyć instrukcji assert do potwierdzenia oczekiwań testowych. introspekcja asercyjna pytest inteligentnie poda wartości pośrednie wyrażenia asertywnego, uwalniając Cię od konieczności poznania wielu nazwJUnit legacy methods.
# content of test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
Użyj następującego wiersza poleceń, aby uruchomić powyższy test. Po uruchomieniu testu na konsoli wyświetlany jest następujący wynik -
C:\Python27>scripts\py.test -v test_sample.py
============================= test session starts =====================
platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:\Pyth
on27\python.exe
cachedir: .cache
rootdir: C:\Python27, inifile:
collected 1 items
test_sample.py::test_answer FAILED
================================== FAILURES =====================
_________________________________ test_answer _________________________________
def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)
test_sample.py:7: AssertionError
========================== 1 failed in 0.05 seconds ====================
Test można również uruchomić z wiersza poleceń, dołączając moduł pytest za pomocą przełącznika –m.
python -m pytest test_sample.py
Grupowanie wielu testów w klasę
Gdy zaczniesz mieć więcej niż kilka testów, często sensowne jest grupowanie testów logicznie, w klasach i modułach. Napiszmy klasę zawierającą dwa testy -
class TestClass:
def test_one(self):
x = "this"
assert 'h' in x
def test_two(self):
x = "hello"
assert hasattr(x, 'check')
Zostanie wyświetlony następujący wynik testu -
C:\Python27>scripts\py.test -v test_class.py
============================= test session starts =====================
platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:\Pyt
on27\python.exe
cachedir: .cache
rootdir: C:\Python27, inifile:
collected 2 items
test_class.py::TestClass::test_one PASSED
test_class.py::TestClass::test_two FAILED
================================== FAILURES =====================
_____________________________ TestClass.test_two ______________________________
self = <test_class.TestClass instance at 0x01309DA0>
def test_two(self):
x = "hello"
> assert hasattr(x, 'check')
E assert hasattr('hello', 'check')
test_class.py:7: AssertionError
===================== 1 failed, 1 passed in 0.06 seconds ======================