992161 презентация

Содержание

Слайд 2

Кратко о докладчике Жизненный путь – с 1983 Python –

Кратко о докладчике

Жизненный путь – с 1983
Python – c 2005
Server-Side для

веб – c 2006
Разработка с pytest – c 2012
Слайд 3

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

TDD в Python — это религия

Самоуничижение
Очищение через страдание
Мистический опыт

Слайд 4

Самоуничижение. Первородный грех Врожденные пороки — нестрогая типизация и duck

Самоуничижение. Первородный грех

Врожденные пороки — нестрогая типизация и duck typing
Как следствие

— природная склонность программиста на Python к совершению маленьких и глупых ошибок
Слайд 5

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

Очищение через страдание

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

Очищение через страдание

Многословные ассерты
self.assertEqual(foo, 1,
'foo is not equal to

one')
Слайд 7

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

Мистический опыт

Django testing setups & teardowns

Слайд 8

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

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

Слайд 9

pytest

pytest

Слайд 10

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

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

Слайд 11

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

pytest fixtures

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

Слайд 12

pytest fixtures Наивный подход. Как это бы сделал я сам

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: conftest.py @pytest.fixture def user(): return

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'
Слайд 14

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

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

Слайд 15

@pytest.fixture def user(): return User(name='Roman', age=30, ...) @pytest.fixture def task(user):

@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'
Слайд 16

Fixture dependencies. Patching object @pytest.fixture def premium(user) user.set_premium() def test_premium(user, premium): assert user.is_premum()

Fixture dependencies. Patching object

@pytest.fixture
def premium(user)
user.set_premium()
def test_premium(user, premium):
assert user.is_premum()

Слайд 17

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

yield_fixture

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

Слайд 18

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

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

Слайд 19

Fixture scopes function scope module scope session scope

Fixture scopes

function scope
module scope
session scope

Слайд 20

Session fixture. Локальный кеш @pytest.yield_fixture(scope='session', autouse=True) def local_cache(): old_settings =

Session fixture. Локальный кеш

@pytest.yield_fixture(scope='session', autouse=True)
def local_cache():
old_settings = settings.CACHES
settings.CACHES =

{'default': {…}}
yield
settings.CACHES = old_settings
Слайд 21

Function fixture. Database transaction rollback @pytest.yield_fixture def tx(): db().start_transaction() yield

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
Слайд 22

Session fixture. Чистый redis @pytest.yield_fixture(scope='session') def redis_server(): proc = subp.Popen(['redis-server',

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
Слайд 23

fixtures parametrization

fixtures parametrization

Слайд 24

Функция возвращает функцию @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') ...

Функция возвращает функцию

@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')
...
Слайд 25

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

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

Слайд 26

Fixtures в отдельном потоке. http://bit.ly/test_pool @pytest.fixture(scope='session') def item_gen(): gen =

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

Слайд 27

Как ещё использовать fixtures warnings: turn MySQL warnings to errors

Как ещё использовать fixtures

warnings: turn MySQL warnings to errors
mock: подготовка mockup

объектов
freezegun: управление временем
selenium: запуск веб-драйвера
Слайд 28

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

Как ещё использовать fixtures

Проверка корректности settings перед тестом
Залогиненный тестовый http client

для Flask или Django
Слайд 29

О чём я ещё не рассказал def pytest_addoption(): параметры командной

О чём я ещё не рассказал

def pytest_addoption(): параметры командной строки
@pytest.mark.parametrize: параметризация

тестов
pytest-django: интеграция с Django
pytest-xdist: параллельные и распределенные тесты
tox: выполнение тестов для разных python
detox: то же самое, только параллельно
Имя файла: 992161.pptx
Количество просмотров: 19
Количество скачиваний: 0