Нескучное тестирование с pytest Роман Иманкулов / @rdotpy / 14 июня 2014.

Презентация:



Advertisements
Похожие презентации
Mock-объекты mock (англ.) – ложный, фиктивный, мнимый, фальшивый, поддельный.
Advertisements

Константин Прищенко Selenium RC и Python: История одного проекта.
JavaScript фреймворки. Куда катится мир. Владимир Кузнецов UWDC2012.
Объектно – ориентированное программирование (ООП) Артишевская Юлия, 222 группа Артишевская Юлия, 222 группа.
Распределённая очередь заданий Смирнов В.А. Меженин М.Г. Доклад по дисциплине «Распределённые объектные технологии» ЮУрГУ 2012.
Занятие Language Reflection Language Reflection – способность объектов к рефлексии, то есть умение давать информацию об исключительно языковых свойствах.
Язык Ruby Денис С. Мигинский. Ruby Создан Юкихиро Мацумото в 1995 г. В основу положены элементы языков Perl, Python, Lisp, Smalltalk и др., а также «принцип.
Занятие Регулярные выражения Памятка (основные элементы регулярных выражений): a+ – любая последовательность a a* – любая последовательность a или.
Microsoft TechDays Прукс Александр
SQL 2012 И ГИБКИЕ МЕТОДЫ КОМАНДНОЙ РАЗРАБОТКИ C TFS Добро пожаловать в команду! Alexander Yakovlev
Обнаружение уязвимостей в web- приложениях, написанных на Python, средствами динамического анализа исходных кодов Заливин Д.А. Козлов Д.Д. Петухов А.А.
Язык Ruby Денис С. Мигинский. Ruby Создан Юкихиро Мацумото в 1995 г. В основу положены элементы языков Perl, Python, Lisp, Smalltalk и др., а также «принцип.
Автотестирование и самотестирование Теория программирования, лекция первая.
Что нового в PHP 5.3Что нового в PHP 5.3Почему PHP 5.3? PHP 5.2 существует уже 1.5 года. В нем найдено несколько серьезных ошибок, которые не могут быть.
LOGO Модульное тестирование. Виды тестов Модульные Тестируется функционал ограниченной части кода (минимум – класса) Тесты изолированы от других частей.
Chapter 9: Creating Dynamic VLANs 9-1 Copyright © 1998, Cisco Systems, Inc.
Unit Testing 1.Что такое Unit Testing 2.Что тестировать? 3.Когда Тестировать? 4.Test Driven Development 5.Пример 6. Виды тестов 7.Макросы проверки 8.Вывод.
Что нового в PHP 5.3 Дмитрий Стогов.
DJANGO Simon Willison Adrian Holovaty Jacob Kaplan-Moss Wilson Miner.
Почему стоит понижать кульутру производства На что обращать внимание, создавая приложения для Django Дмитрий Лебедев skype: siberianoNsk.
Транксрипт:

Нескучное тестирование с pytest Роман Иманкулов / 14 июня 2014

Кратко о докладчике Жизненный путь – с 1983 Python – c 2005 Server-Side для веб – c 2006 Разработка с pytest – c 2012

TDD в Python это религия Самоуничижение Очищение через страдание Мистический опыт

Самоуничижение. Первородный грех Врожденные пороки нестрогая типизация и duck typing Как следствие природная склонность программиста на Python к совершению маленьких и глупых ошибок

Очищение через страдание Boilerplate Code class TestSequenceFunctions(unittest.TestCase): def setUp(self):... def tearDown(self):... def testFoo(self):...

Очищение через страдание Многословные ассерты self.assertEqual(foo, 1, 'foo is not equal to one')

Мистический опыт Django testing setups & teardowns

Есть ли альтернатива?

pytest

pytest это не еще один xUnit фреймворк!

pytest fixtures То, что отличает pytest от других фреймворков

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'

pytest fixtures Подход pytest file: def user(): return User(name='Roman', age=30,...) file: test_user.py def test_user(user): assert user.name == 'Roman'

Зависимости между fixtures

@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'

Fixture dependencies. Patching def premium(user) user.set_premium() def test_premium(user, premium): assert user.is_premum()

yield_fixture setup и teardown в одном флаконе

@pytest.yield_fixture def user(): obj = User(name='Roman', age=30,...) yield obj obj.delete()

Fixture scopes function scope module scope session scope

Session fixture. Локальный autouse=True) def local_cache(): old_settings = settings.CACHES settings.CACHES = {'default': {…}} yield settings.CACHES = old_settings

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

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

fixtures parametrization

Функция возвращает def set_lang(user): def func(lang_code): user.set_lang(lang_code) return func def test_languages(user, set_lang): set_lang('ru')...

Странные вещи

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

Как ещё использовать fixtures warnings: turn MySQL warnings to errors mock: подготовка mockup объектов freezegun: управление временем selenium: запуск веб-драйвера

Как ещё использовать fixtures Проверка корректности settings перед тестом Залогиненный тестовый http client для Flask или Django

О чём я ещё не рассказал def pytest_addoption(): параметры командной параметризация тестов pytest-django: интеграция с Django pytest-xdist: параллельные и распределенные тесты tox: выполнение тестов для разных python detox: то же самое, только параллельно

Спасибо! Вопросы? Роман Иманкулов /