Тестирует функции с именем
test_*, методы test_* в классе Test* или в классе наследнике unittest.TestCase# content of test_sample.pydef inc(x): return x + 1def test_answer(): assert inc(3) == 5======= test session starts ========
platform linux — Python 3.5.2, pytest-3.0.7, py-1.4.32, pluggy-0.4.0
rootdir: $REGENDOC_TMPDIR, inifile:
collected 1 items
test_sample.py F
======= FAILURES ========
_______ test_answer ________
def test_answer():
> assert inc(3) == 5
E assert 4 == 5
E + where 4 = inc(3)
test_sample.py:5: AssertionError
======= 1 failed in 0.12 seconds ========
platform linux — Python 3.5.2, pytest-3.0.7, py-1.4.32, pluggy-0.4.0
rootdir: $REGENDOC_TMPDIR, inifile:
collected 1 items
test_sample.py F
======= FAILURES ========
_______ test_answer ________
def test_answer():
> assert inc(3) == 5
E assert 4 == 5
E + where 4 = inc(3)
test_sample.py:5: AssertionError
======= 1 failed in 0.12 seconds ========
Параметризированный вызов теста:
import pytest@pytest.mark.parametrize("test_input,expected", [ ("3+5", 8), ("2+4", 6), ("6*9", 42),])def test_eval(test_input, expected): assert eval(test_input) == expectedКонтексты тестирования, монкипатч (замена стандартного ввода/вывода на время теста)
import ioimport sysdef test_smth(capsys, monkeypath): handle = io.StringIO('!') monkeypath.setattr(sys, 'stdin', handle) start_smth() output, _err = capsys.readouterr() assert output == '!'Плагины для
py.test:pytest-cov: coverage reporting, compatible with distributed testingpytest-django: write tests for django apps, using pytest integrationpytest-timeout: to timeout tests based on function marks or global definitionspytest-pep8: a —pep8 option to enable PEP8 compliance checkingHypothesis - API для формулирования и проверки свойств. Production ready on Python.
Hypothesis is a modern implementation of property based testing, designed from the ground up for mainstream languages.
Модуль
strategies определяет как генерировать числа, списки, строки и другие примитивы для тестирования работы функций (гипотез)Декоратор
@given определяет спецификацию параметров функции, которые нужно генерироватьЗапуск проверки гипотез через pytest:
C:\Users\MainUser\AppData\Local\Programs\Python\Python35\python.exe -m pytest hyp_tests.py
C:\Users\MainUser\AppData\Local\Programs\Python\Python35\python.exe -m pytest hyp_tests.py
============================= test session starts =============================platform win32 -- Python 3.5.1, pytest-3.0.7, py-1.4.33, pluggy-0.4.0rootdir: C:\Users\MainUser\PycharmProjects\hypothesis_tests, inifile:plugins: hypothesis-3.8.2collected 1 items hyp_tests.py F================================== FAILURES ===================================__________________________________ test_sort __________________________________ @given(st.lists(st.integers()))> def test_sort(xs):hyp_tests.py:8:...xs = [0, 0, 0, 0, 0, 0, ...] @given(st.lists(st.integers())) def test_sort(xs): res = sorted(xs)> assert all(xi <= xj for xi, xj in zip(res, res[1:]))E assert FalseE + where False = all(<generator object test_sort.<locals>.<genexpr> at 0x00000196C78AA410>)hyp_tests.py:10: AssertionError--------------------------------- Hypothesis ----------------------------------Falsifying example: test_sort(xs=[0, 0, 0, 0, 0, 0, 1, 0])========================== 1 failed in 0.52 seconds ===========================import pytestimport hypothesisimport hypothesis.strategies as stfrom hypothesis import given@given(st.lists(st.integers()))def test_sort(xs): res = sorted(xs) assert all(xi <= xj for xi, xj in zip(res, res[1:]))def sorted(xs, f=sorted): return xs if len(xs) == 8 else f(xs)if __name__ == "__main__": pytest.main(__file__)