Написание юнит-тестов большинству представляется занятием скучным и до некоторой степени бесполезным. Мое мнение — это всё оттого, что сама "классическая" схема юнит-тестов подразумевает непродуктивное написание унылого линейного кода.
В докладе я расскажу о том, как с помощью pytest начать писать тесты, которые приятно читать и поддерживать, почему setUp и tearDown — это прошлый век, как с помощью правильной организации fixtures ускорить исполнение тестов, а также какие ещё уловки могут помочь вам в вашей нелегкой борьбе с рутиной.
14. pytest fixtures
Наивный подход. Как это бы сделал я сам
file: fixtures.py
def get_user():
return User(name='Roman', age=30, ...)
file: test_user.py
def test_user():
user = get_user()
assert user.name == 'Roman'
29. Как ещё использовать fixtures
• warnings: turn MySQL warnings to errors
• mock: подготовка mockup объектов
• freezegun: управление временем
• selenium: запуск веб-драйвера
30. О чём я ещё не рассказал
def pytest_addoption(parser):
parser.addoption("cleanmysql",
action="store_true", default=False)
@pytest.fixture(scope='session', autouse=True)
def clean_mysql(request):
if not request.config.getoption('cleanmysql'):
return
# clean MySQL tables heres
31. О чём я ещё не рассказал
@pytest.mark.parametrize("input,expected", [
("3+5", 8),
("2+4", 6),
])
def test_eval(input, expected):
assert eval(input) == expected
32. О чём я ещё не рассказал
• pytest-django: интеграция с Django
• pytest-xdist: параллельные и
распределенные тесты
33. О чём я ещё не рассказал
• tox: выполнение тестов для разных python
• detox: то же самое, только параллельно
[tox]
envlist = py26,py27
[testenv]
deps=pytest
commands=py.test