Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемАнна Нефёдочкина
1 Нескучное тестирование с pytest Роман Иманкулов / 14 июня 2014
2 Кратко о докладчике Жизненный путь – с 1983 Python – c 2005 Server-Side для веб – c 2006 Разработка с pytest – c 2012
3 TDD в Python это религия Самоуничижение Очищение через страдание Мистический опыт
4 Самоуничижение. Первородный грех Врожденные пороки нестрогая типизация и duck typing Как следствие природная склонность программиста на Python к совершению маленьких и глупых ошибок
5 Очищение через страдание Boilerplate Code class TestSequenceFunctions(unittest.TestCase): def setUp(self):... def tearDown(self):... def testFoo(self):...
6 Очищение через страдание Многословные ассерты self.assertEqual(foo, 1, 'foo is not equal to one')
7 Мистический опыт Django testing setups & teardowns
8 Есть ли альтернатива?
9 pytest
10 pytest это не еще один xUnit фреймворк!
11 pytest fixtures То, что отличает pytest от других фреймворков
12 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'
13 pytest fixtures Подход pytest file: def user(): return User(name='Roman', age=30,...) file: test_user.py def test_user(user): assert user.name == 'Roman'
14 Зависимости между fixtures
15 @pytest.fixture def user(): return User(name='Roman', def task(user): return Task(user=user, name='...') def test_task(task): assert task.user.name == 'Roman'
16 Fixture dependencies. Patching def premium(user) user.set_premium() def test_premium(user, premium): assert user.is_premum()
17 yield_fixture setup и teardown в одном флаконе
18 @pytest.yield_fixture def user(): obj = User(name='Roman', age=30,...) yield obj obj.delete()
19 Fixture scopes function scope module scope session scope
20 Session fixture. Локальный autouse=True) def local_cache(): old_settings = settings.CACHES settings.CACHES = {'default': {…}} yield settings.CACHES = old_settings
21 Function fixture. Database transaction def tx(): db().start_transaction() yield db().rollback() def test_user(user, tx, project, task): # project & task will be removed automatically
22 Session fixture. Чистый def redis_server(): proc = subp.Popen(['redis-server', '--port', 7777],... ) yield proc def rc(redis_server): client = redis.StrictRedis('redis:// :7777') client.flushall() return client
23 fixtures parametrization
24 Функция возвращает def set_lang(user): def func(lang_code): user.set_lang(lang_code) return func def test_languages(user, set_lang): set_lang('ru')...
25 Странные вещи
26 Fixtures в отдельном потоке. def item_gen(): gen = Generator(lambda:.) gen.start() return def item(item_gen, item_rel): item = item_gen.get() yield item def item_rel(): rel = Releaser(lambda o:...) rel.start() return rel
27 Как ещё использовать fixtures warnings: turn MySQL warnings to errors mock: подготовка mockup объектов freezegun: управление временем selenium: запуск веб-драйвера
28 Как ещё использовать fixtures Проверка корректности settings перед тестом Залогиненный тестовый http client для Flask или Django
29 О чём я ещё не рассказал def pytest_addoption(): параметры командной параметризация тестов pytest-django: интеграция с Django pytest-xdist: параллельные и распределенные тесты tox: выполнение тестов для разных python detox: то же самое, только параллельно
30 Спасибо! Вопросы? Роман Иманкулов /
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.