SlideShare une entreprise Scribd logo
1  sur  34
Télécharger pour lire hors ligne
Нескучное тестирование
с 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 — это не еще один
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

Contenu connexe

Tendances

Python Programming - Files & Exceptions
Python Programming - Files & ExceptionsPython Programming - Files & Exceptions
Python Programming - Files & ExceptionsOmid AmirGhiasvand
 
The Power Of Composition (DotNext 2019)
The Power Of Composition (DotNext 2019)The Power Of Composition (DotNext 2019)
The Power Of Composition (DotNext 2019)Scott Wlaschin
 
Map, Filter and Reduce In Python
Map, Filter and Reduce In PythonMap, Filter and Reduce In Python
Map, Filter and Reduce In PythonSimplilearn
 
Python - gui programming (tkinter)
Python - gui programming (tkinter)Python - gui programming (tkinter)
Python - gui programming (tkinter)Learnbay Datascience
 
The Art Of Debugging
The Art Of DebuggingThe Art Of Debugging
The Art Of Debuggingsvilen.ivanov
 
Python Functions Tutorial | Working With Functions In Python | Python Trainin...
Python Functions Tutorial | Working With Functions In Python | Python Trainin...Python Functions Tutorial | Working With Functions In Python | Python Trainin...
Python Functions Tutorial | Working With Functions In Python | Python Trainin...Edureka!
 
Automation - web testing with selenium
Automation - web testing with seleniumAutomation - web testing with selenium
Automation - web testing with seleniumTzirla Rozental
 
Sum and Product Types - The Fruit Salad & Fruit Snack Example - From F# to Ha...
Sum and Product Types -The Fruit Salad & Fruit Snack Example - From F# to Ha...Sum and Product Types -The Fruit Salad & Fruit Snack Example - From F# to Ha...
Sum and Product Types - The Fruit Salad & Fruit Snack Example - From F# to Ha...Philip Schwarz
 
Arrays in python
Arrays in pythonArrays in python
Arrays in pythonmoazamali28
 
How to use Map() Filter() and Reduce() functions in Python | Edureka
How to use Map() Filter() and Reduce() functions in Python | EdurekaHow to use Map() Filter() and Reduce() functions in Python | Edureka
How to use Map() Filter() and Reduce() functions in Python | EdurekaEdureka!
 
Python- Regular expression
Python- Regular expressionPython- Regular expression
Python- Regular expressionMegha V
 
Test Automation and Selenium
Test Automation and SeleniumTest Automation and Selenium
Test Automation and SeleniumKarapet Sarkisyan
 
Inline function
Inline functionInline function
Inline functionTech_MX
 

Tendances (20)

Python Programming - Files & Exceptions
Python Programming - Files & ExceptionsPython Programming - Files & Exceptions
Python Programming - Files & Exceptions
 
The Power Of Composition (DotNext 2019)
The Power Of Composition (DotNext 2019)The Power Of Composition (DotNext 2019)
The Power Of Composition (DotNext 2019)
 
Operator Overloading in C++
Operator Overloading in C++Operator Overloading in C++
Operator Overloading in C++
 
Python recursion
Python recursionPython recursion
Python recursion
 
Map, Filter and Reduce In Python
Map, Filter and Reduce In PythonMap, Filter and Reduce In Python
Map, Filter and Reduce In Python
 
Python - gui programming (tkinter)
Python - gui programming (tkinter)Python - gui programming (tkinter)
Python - gui programming (tkinter)
 
8 python data structure-1
8 python data structure-18 python data structure-1
8 python data structure-1
 
The Art Of Debugging
The Art Of DebuggingThe Art Of Debugging
The Art Of Debugging
 
Python Functions Tutorial | Working With Functions In Python | Python Trainin...
Python Functions Tutorial | Working With Functions In Python | Python Trainin...Python Functions Tutorial | Working With Functions In Python | Python Trainin...
Python Functions Tutorial | Working With Functions In Python | Python Trainin...
 
Python Programming
Python ProgrammingPython Programming
Python Programming
 
Namespaces
NamespacesNamespaces
Namespaces
 
Python
PythonPython
Python
 
Python libraries
Python librariesPython libraries
Python libraries
 
Automation - web testing with selenium
Automation - web testing with seleniumAutomation - web testing with selenium
Automation - web testing with selenium
 
Sum and Product Types - The Fruit Salad & Fruit Snack Example - From F# to Ha...
Sum and Product Types -The Fruit Salad & Fruit Snack Example - From F# to Ha...Sum and Product Types -The Fruit Salad & Fruit Snack Example - From F# to Ha...
Sum and Product Types - The Fruit Salad & Fruit Snack Example - From F# to Ha...
 
Arrays in python
Arrays in pythonArrays in python
Arrays in python
 
How to use Map() Filter() and Reduce() functions in Python | Edureka
How to use Map() Filter() and Reduce() functions in Python | EdurekaHow to use Map() Filter() and Reduce() functions in Python | Edureka
How to use Map() Filter() and Reduce() functions in Python | Edureka
 
Python- Regular expression
Python- Regular expressionPython- Regular expression
Python- Regular expression
 
Test Automation and Selenium
Test Automation and SeleniumTest Automation and Selenium
Test Automation and Selenium
 
Inline function
Inline functionInline function
Inline function
 

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

Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNGДмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNGDataArt
 
Тестирование в mail.ru (Дмитрий Зенович)
Тестирование в mail.ru (Дмитрий Зенович)Тестирование в mail.ru (Дмитрий Зенович)
Тестирование в mail.ru (Дмитрий Зенович)Ontico
 
Введение в специальность. Якин Дмитрий - QA: полицейский, нянька и прочие рол...
Введение в специальность. Якин Дмитрий - QA: полицейский, нянька и прочие рол...Введение в специальность. Якин Дмитрий - QA: полицейский, нянька и прочие рол...
Введение в специальность. Якин Дмитрий - QA: полицейский, нянька и прочие рол...kontur_student
 
тесты с фикстурами
тесты с фикстурамитесты с фикстурами
тесты с фикстурамиIvan Grishaev
 
Особенности тестирования открытого ПО
Особенности тестирования открытого ПООсобенности тестирования открытого ПО
Особенности тестирования открытого ПОAlexey Lyanguzov
 
Специфика тестирования проектов с открытым исходным кодом
Специфика тестирования проектов с открытым исходным кодомСпецифика тестирования проектов с открытым исходным кодом
Специфика тестирования проектов с открытым исходным кодомSQALab
 
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...SQALab
 
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Maksim Grinevich
 
Иван Евтухович — Как перестать релизиться и начать жить
Иван Евтухович — Как перестать релизиться и начать житьИван Евтухович — Как перестать релизиться и начать жить
Иван Евтухович — Как перестать релизиться и начать житьDaria Oreshkina
 
лившиц владимир - независимое тестирование миф
лившиц владимир - независимое тестирование мифлившиц владимир - независимое тестирование миф
лившиц владимир - независимое тестирование мифMagneta AI
 
Юнит тестирование в Web. Как получать пользу и удовольствие.
Юнит тестирование в Web. Как получать пользу и удовольствие.Юнит тестирование в Web. Как получать пользу и удовольствие.
Юнит тестирование в Web. Как получать пользу и удовольствие.Sergey Ryabenko
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыYuri Zhloba
 
Юрий Жлоба - Опыт использования Erlang в разработке многопользовательской игры.
Юрий Жлоба -  Опыт использования Erlang в разработке многопользовательской игры.Юрий Жлоба -  Опыт использования Erlang в разработке многопользовательской игры.
Юрий Жлоба - Опыт использования Erlang в разработке многопользовательской игры.IT Share
 
Учим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTestУчим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTestRina Uzhevko
 
JavaTalks.Unit Testing.Part 1
JavaTalks.Unit Testing.Part 1JavaTalks.Unit Testing.Part 1
JavaTalks.Unit Testing.Part 1sgdread
 
Белым по черному или альтернативное использование unit-тестирования
Белым по черному или альтернативное использование unit-тестированияБелым по черному или альтернативное использование unit-тестирования
Белым по черному или альтернативное использование unit-тестированияSQALab
 
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестированияCodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестированияCodeFest
 
Обучение тестированию
Обучение тестированиюОбучение тестированию
Обучение тестированиюAPostovalova
 

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

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

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