SlideShare a Scribd company logo
Нескучное тестирование
с pytest
Роман Иманкулов / @rdotpy / 27 июня 2014
Почему программисты
не любят писать тесты?
Тестирование в 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
Нескучное тестирование с 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: conftest.py
    @pytest.fixture
    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', age=30, ...)       
@pytest.fixture
def task(user):
    return Task(user=user, name='...')
def test_task(task):
    assert task.user.name == 'Roman'
Fixture dependencies. Patching object
@pytest.fixture
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. Локальный кеш
@pytest.yield_fixture(scope='session', autouse=True)
def local_cache():
    old_settings = settings.CACHES
    settings.CACHES = {'default': {…}}
    yield
    settings.CACHES = old_settings
Function fixture.
Database transaction rollback
@pytest.yield_fixture
def tx():
    db().start_transaction()
    yield
    db().rollback()
def test_user(user, tx, project, task):
    # project & task will be removed automatically
Session fixture. Чистый redis
@pytest.yield_fixture(scope='session')
def redis_server():
    proc = subp.Popen(['redis­server', '­­port', 7777], ... )
    yield proc
    proc.terminate()
@pytest.fixture
def rc(redis_server):
    client = redis.StrictRedis('redis://127.0.0.1:7777')
    client.flushall()
    return client
fixtures parametrization
Функция возвращает функцию
@pytest.fixture
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 в отдельном потоке
http://bit.ly/test_pool
@pytest.fixture(scope='session')
def item_gen():
    gen = Generator(lambda: .)
    gen.start()
    return gen
@pytest.yield_fixture
def item(item_gen, item_rel):
    item = item_gen.get()
    yield item
    item_rel.put(item)
@pytest.fixture(scope='session')
def item_rel():
    rel = Releaser(lambda o: ...)
    rel.start()
    return rel
Как ещё использовать fixtures
• warnings: turn MySQL warnings to errors
• mock: подготовка mockup объектов
• freezegun: управление временем
• selenium: запуск веб-драйвера
О чём я ещё не рассказал
def pytest_addoption(parser):
    parser.addoption("­­clean­mysql",
  action="store_true", default=False)
@pytest.fixture(scope='session', autouse=True)
def clean_mysql(request):
    if not request.config.getoption('­­clean­mysql'):   
        return
     # clean MySQL tables heres
О чём я ещё не рассказал
@pytest.mark.parametrize("input,expected", [
    ("3+5", 8),
    ("2+4", 6),
])
def test_eval(input, expected):
    assert eval(input) == expected
О чём я ещё не рассказал
• pytest-django: интеграция с Django
• pytest-xdist: параллельные и
распределенные тесты
О чём я ещё не рассказал
• tox: выполнение тестов для разных python
• detox: то же самое, только параллельно
[tox]
envlist = py26,py27
[testenv]
deps=pytest  
commands=py.test
Спасибо! Вопросы?
Роман Иманкулов / @rdotpy / http://imankulov.name

More Related Content

PDF
Microservices, Kubernetes and Istio - A Great Fit!
PDF
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
PPTX
おすすめVimプラグインまとめ
PPTX
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
PDF
Google cloud run + elixir boilerplate
PDF
Intro to GitHub Actions
PDF
C/C++とWebAssemblyを利用したライブラリ開発
PDF
多様な働き⽅のチームでどうやって アジャイルにやるの?(雁行陣開発)
Microservices, Kubernetes and Istio - A Great Fit!
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
おすすめVimプラグインまとめ
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Google cloud run + elixir boilerplate
Intro to GitHub Actions
C/C++とWebAssemblyを利用したライブラリ開発
多様な働き⽅のチームでどうやって アジャイルにやるの?(雁行陣開発)

What's hot (20)

PDF
人工知能のための哲学塾 東洋哲学篇 第四夜 「龍樹とインド哲学と人工知能」
PDF
磯野ー!関数型言語やろうぜー!
PPTX
Nomad + Flatcar: a harmonious marriage of lightweights
PDF
JUnit5 and TestContainers
PDF
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
PPTX
Golang Restful 서버 개발기
PDF
Kubernetes Secrets Management on Production with Demo
PDF
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
PPTX
PlayFabとAppCenterのユーザ情報を連携してAppCenterの機能を活用しよう
PDF
12 分くらいで知るLuaVM
PDF
脱Unity!? UE4でVR開発のここが変わった
PDF
Training Webinar: Fitting OutSystems applications into Enterprise Architecture
PPTX
Chatbot with RASA | Valuebound
PDF
Get started with gitops and flux
PDF
ロボット好き集まれ!こいつ、動くぞ。星と翼のパラドクス開発事例
PDF
Unityネイティブプラグインの勧め
PDF
WebAssemblyのWeb以外のことぜんぶ話す
PPTX
UE4のためのより良いゲーム設計を理解しよう!
PDF
目grepのはなし
PDF
UE4とUnrealC++について
人工知能のための哲学塾 東洋哲学篇 第四夜 「龍樹とインド哲学と人工知能」
磯野ー!関数型言語やろうぜー!
Nomad + Flatcar: a harmonious marriage of lightweights
JUnit5 and TestContainers
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
Golang Restful 서버 개발기
Kubernetes Secrets Management on Production with Demo
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
PlayFabとAppCenterのユーザ情報を連携してAppCenterの機能を活用しよう
12 分くらいで知るLuaVM
脱Unity!? UE4でVR開発のここが変わった
Training Webinar: Fitting OutSystems applications into Enterprise Architecture
Chatbot with RASA | Valuebound
Get started with gitops and flux
ロボット好き集まれ!こいつ、動くぞ。星と翼のパラドクス開発事例
Unityネイティブプラグインの勧め
WebAssemblyのWeb以外のことぜんぶ話す
UE4のためのより良いゲーム設計を理解しよう!
目grepのはなし
UE4とUnrealC++について
Ad

Similar to Нескучное тестирование с pytest (20)

PPTX
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
PPTX
Тестирование в mail.ru (Дмитрий Зенович)
PPTX
Введение в специальность. Якин Дмитрий - QA: полицейский, нянька и прочие рол...
PDF
тесты с фикстурами
PDF
Особенности тестирования открытого ПО
PDF
Специфика тестирования проектов с открытым исходным кодом
PPTX
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
PPTX
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
PDF
Иван Евтухович — Как перестать релизиться и начать жить
PPT
лившиц владимир - независимое тестирование миф
PPT
Юнит тестирование в Web. Как получать пользу и удовольствие.
PDF
Юрий Жлоба - Опыт использования Erlang в разработке многопользовательской игры.
PDF
Опыт использования Erlang в разработке многопользовательской игры
PDF
Учим автотесты человеческому языку с помощью Allure и PyTest
PPT
JavaTalks.Unit Testing.Part 1
PDF
Testing C code with Python
PDF
10M tests per day
PPT
Белым по черному или альтернативное использование unit-тестирования
PDF
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
PPTX
Обучение тестированию
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
Тестирование в mail.ru (Дмитрий Зенович)
Введение в специальность. Якин Дмитрий - QA: полицейский, нянька и прочие рол...
тесты с фикстурами
Особенности тестирования открытого ПО
Специфика тестирования проектов с открытым исходным кодом
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Иван Евтухович — Как перестать релизиться и начать жить
лившиц владимир - независимое тестирование миф
Юнит тестирование в Web. Как получать пользу и удовольствие.
Юрий Жлоба - Опыт использования Erlang в разработке многопользовательской игры.
Опыт использования Erlang в разработке многопользовательской игры
Учим автотесты человеческому языку с помощью Allure и PyTest
JavaTalks.Unit Testing.Part 1
Testing C code with Python
10M tests per day
Белым по черному или альтернативное использование unit-тестирования
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
Обучение тестированию
Ad

Нескучное тестирование с pytest