SlideShare una empresa de Scribd logo
1 de 19
Descargar para leer sin conexión
Тесты с
фикстурами
Иван Гришаев
ivan@grishaev.me
Проблема
мы пишем на Питоне (Руби, ПХП, Js…)
язык не сигнализирует об ошибках
None или Exception?
слабая типизация
нужно много тестов
Пример
Базовая авторизация:
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
username:password
достать юзера
в результате:
ошибка разбиения строк
ошибка декодирования
ошибка разбиения строк (еще раз)
исключение, если нет юзера
xUnit
JUnit – дедушка современных тест-систем
портирован на все что можно
прошел испытание временем
не учитывает особенности целевой платформы
Тесты на ООП – плохо
связывание сущностей, наследование, миксины
тесты каскадно отваливаются
нет повторного использования кода
огромные setUp
Где-где падает?
@patch("some.module.foo", Mock(...))
@patch("some.module.bar", Mock(...))
@patch("some.module.baz", Mock(...))
@patch("some.module.pip", Mock(...))
class MyTest(TestCase, MyMixin, CacheMixin):
...
@override_settings(VALUE=42)
@patch("other.module.func", Mock(...))
def test_ok(self):
self.do_stuff()
...
В сетапе, говоришь?
def setUp(self):
self.entity.user_requests_count = 0
self.entity.user = {}
self.bar_user_goods_by_front_mock = Mock(return_value=(True, OTHER_DATA))
self.backend_user_mock = Mock(return_value=(True, BACKEND_MOCK))
self.baz_single = Mock(return_value=(True, TEST_SINGLE))
self.storage_mock = Mock(return_value=(200, STORAGE_DATA_NEW))
self.storage_new_mock = Mock(return_value=(200, FAKE_STORAGE))
self.shop_user_stats_mock = Mock(return_value=(True, TEST_USER_STATS_RESPONSE
self.shop_mock = Mock(return_value=(True, TEST_LIST_RESPONSE))
self.user_mock = Mock(return_value=(True, TEST_EVENTS_USER_SHOP))
self.list_mock = Mock(return_value=(True, TEST_BAZ))
self.user_goods_mock = Mock(side_effect=lambda user_id, **kwargs: (True, {'go
self.user_friends_mock = Mock(return_value=(200, [{'id': 1}, {'id': 2}, {'id'
self.current_mock = Mock(return_value=(True, TEST_SOME_DATA))
self.test_mock = Mock(return_value=(True, {}))
self.price_mock = Mock(return_value=(True, {'data': [TEST_OTHER_DATA]}))
self.foo_mock = Mock(return_value=(400, None))
self.some_mock = Mock(return_value=(400, None))
self.user_money_mock = Mock(return_value=(200, TEST_USER_MONEY))
self.foo_some_mock = Mock(return_value=(True, TEST_USER_GOODS))
self.foo_some_goods_mock = Mock(return_value=(True, TEST_USER_GOODS_RESPONSE)
Что такое тест?
test = predicate(Environment)
Надо так
test = predicate(env1, env2, ... , envN)
Получаются наборы
test_ok = predicate(env1, env2)
test_failture = predicate(env1)
test_high_price = predicate(env1, env2, env3)
Фреймворки на фикстурах
Clojure(script) core.test
PyTest
Что такое фикстура?
любой объект с тремя стадиями:
инициализация
участие в исполнении теста
удаление
def test_ok(fixture1, fixture2):
...
f1 = fixture1()
f2 = fixture1()
test_ok(f1, f2)
del f1
del f2
разный срок жизни
функция
модуль
сеанс
Преимущества
тест – это функция
однозначная зависимость от фикстур:
def test_buy(user, goods, cache, auth)
def test_auth_failture(user, auth)
независимость тестов
настоящее переиспользование кода
REST-микросервис
Фикстура – сервис авторизации
не надо мокать, все запросы уходят в localhost
app = Flask(__name__)
@app.route("/user/auth")
def endpoint_auth(requrest):
return jsonify({
'user': {'name': 'User Name', 'status': 'active'}
})
@pytest.yield_fixture(scope="session")
def fix_auth():
from multiprocess import Process
p = Process(app.run, "127.0.0.1", 9001, True)
p.start()
yield app
p.terminate()
Изображения
Фикстура для подготовки изображений
@pytest.yield_fixture(scope="functions")
def fix_avatar():
path = "~/some/path/avatar.png"
avatar = PIL.Image(path)
yield avatar
os.unlink(path)
Кеш
Фикстура для чистого кеша
@pytest.fixture(scope='function')
def cache(request):
_cache = django_cache
_cache.clear()
request.addfinalizer(_cache.clear)
return _cache
Параметрические
фикстуры
заменяют циклы
легко добавить еще один случай
справится ли приложение с аватарой 1x1, 128x1,
5000x5000?
@pytest.fixture(scope="function",
params=[(1, 1), (128, 1), (5000, 5000)])
def fix_avatar((w, h)):
path = "~/some/path/avatar.png"
avatar = PIL.Image(path, (w, h))
...
Выводы
писать и поддерживать тесты стало легче
меньше копипасты
на борту фреймворка много других фишек
слова коллеги, который с давно питоном: "не думал,
что Пайтест меня так удивит"
Вопросы?

Más contenido relacionado

La actualidad más candente

Инструментальный подход к разработке протоколов
Инструментальный подход к разработке протоколовИнструментальный подход к разработке протоколов
Инструментальный подход к разработке протоколовfurj
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.Igor Shkulipa
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3it-people
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Dima Dzuba
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»Unguryan Vitaliy
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...GeeksLab Odessa
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Stfalcon Meetups
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.Igor Shkulipa
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - MultithreadingNoveo
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 

La actualidad más candente (19)

Инструментальный подход к разработке протоколов
Инструментальный подход к разработке протоколовИнструментальный подход к разработке протоколов
Инструментальный подход к разработке протоколов
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
 
Bytecode
BytecodeBytecode
Bytecode
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментом
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
JRebel
JRebelJRebel
JRebel
 
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
 
Java: вчера, сегодня, завтра
Java: вчера, сегодня, завтраJava: вчера, сегодня, завтра
Java: вчера, сегодня, завтра
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.
 
Gen server
Gen serverGen server
Gen server
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - Multithreading
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 

Similar a тесты с фикстурами

Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовMskDotNet Community
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirCodeFest
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with SeleniumSergey Shvets
 
Victor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysVictor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysLiloSEA
 
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів»  Lviv QA Day 2019ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів»  Lviv QA Day 2019
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019GoQA
 
Unit testing iOS Applications
Unit testing iOS ApplicationsUnit testing iOS Applications
Unit testing iOS ApplicationsAndrey Volobuev
 
Angular 2. lost in translation
Angular 2.  lost in translationAngular 2.  lost in translation
Angular 2. lost in translationallfayn
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgIT61
 
Testing dojo. Вступительная презентация
Testing dojo. Вступительная презентацияTesting dojo. Вступительная презентация
Testing dojo. Вступительная презентацияtkurnosova
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish SQALab
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...yaevents
 
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...Iosif Itkin
 
Стратегия тестирования крупного проекта в условиях Agile разработки v2
Стратегия тестирования крупного проекта в условиях Agile разработки v2Стратегия тестирования крупного проекта в условиях Agile разработки v2
Стратегия тестирования крупного проекта в условиях Agile разработки v2Magneta AI
 
iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)Yandex
 
Let's Talk About Junit 5
Let's Talk About Junit 5Let's Talk About Junit 5
Let's Talk About Junit 5SQALab
 
Java весна 2014 лекция 1
Java весна 2014 лекция 1Java весна 2014 лекция 1
Java весна 2014 лекция 1Technopark
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionAlbina Tiupa
 

Similar a тесты с фикстурами (20)

Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with Selenium
 
Unit тесты java
Unit тесты javaUnit тесты java
Unit тесты java
 
Victor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysVictor Kuliamin.CSEDays
Victor Kuliamin.CSEDays
 
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів»  Lviv QA Day 2019ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів»  Lviv QA Day 2019
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019
 
Unit testing iOS Applications
Unit testing iOS ApplicationsUnit testing iOS Applications
Unit testing iOS Applications
 
Angular 2. lost in translation
Angular 2.  lost in translationAngular 2.  lost in translation
Angular 2. lost in translation
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
 
Testing dojo. Вступительная презентация
Testing dojo. Вступительная презентацияTesting dojo. Вступительная презентация
Testing dojo. Вступительная презентация
 
07-testing.pdf
07-testing.pdf07-testing.pdf
07-testing.pdf
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
 
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
 
Стратегия тестирования крупного проекта в условиях Agile разработки v2
Стратегия тестирования крупного проекта в условиях Agile разработки v2Стратегия тестирования крупного проекта в условиях Agile разработки v2
Стратегия тестирования крупного проекта в условиях Agile разработки v2
 
iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)
 
Let's Talk About Junit 5
Let's Talk About Junit 5Let's Talk About Junit 5
Let's Talk About Junit 5
 
Java весна 2014 лекция 1
Java весна 2014 лекция 1Java весна 2014 лекция 1
Java весна 2014 лекция 1
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с Codeception
 

Más de Ivan Grishaev

Основы машинного обучения. Дмитрий Соболев
Основы машинного обучения. Дмитрий СоболевОсновы машинного обучения. Дмитрий Соболев
Основы машинного обучения. Дмитрий СоболевIvan Grishaev
 
Что такое говнокод
Что такое говнокодЧто такое говнокод
Что такое говнокодIvan Grishaev
 
Why everyone like ruby
Why everyone like rubyWhy everyone like ruby
Why everyone like rubyIvan Grishaev
 
В поисках удаленной работы за рубежом
В поисках удаленной работы за рубежомВ поисках удаленной работы за рубежом
В поисках удаленной работы за рубежомIvan Grishaev
 
Еще раз про качество
Еще раз про качествоЕще раз про качество
Еще раз про качествоIvan Grishaev
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к AnsibleIvan Grishaev
 
Чек-лист ежедневных действий для сообществ компаний в соц. сетях
Чек-лист ежедневных действий для сообществ компаний в соц. сетяхЧек-лист ежедневных действий для сообществ компаний в соц. сетях
Чек-лист ежедневных действий для сообществ компаний в соц. сетяхIvan Grishaev
 
10 вопросов, которые следует задать будущему работодателю
10 вопросов, которые следует задать будущему работодателю10 вопросов, которые следует задать будущему работодателю
10 вопросов, которые следует задать будущему работодателюIvan Grishaev
 
Project Management в разрезе бихевиоризма и общей педагогики
Project Management в разрезе бихевиоризма и общей педагогикиProject Management в разрезе бихевиоризма и общей педагогики
Project Management в разрезе бихевиоризма и общей педагогикиIvan Grishaev
 
Ci на базе docker
Ci на базе dockerCi на базе docker
Ci на базе dockerIvan Grishaev
 
Личный взгляд на Clojure
Личный взгляд на ClojureЛичный взгляд на Clojure
Личный взгляд на ClojureIvan Grishaev
 
Erlang, который мы потеряли
Erlang, который мы потерялиErlang, который мы потеряли
Erlang, который мы потерялиIvan Grishaev
 
Расстаемся с мифами о ФП
Расстаемся с мифами о ФП Расстаемся с мифами о ФП
Расстаемся с мифами о ФП Ivan Grishaev
 

Más de Ivan Grishaev (16)

Основы машинного обучения. Дмитрий Соболев
Основы машинного обучения. Дмитрий СоболевОсновы машинного обучения. Дмитрий Соболев
Основы машинного обучения. Дмитрий Соболев
 
Docker
DockerDocker
Docker
 
NoSQL pain
NoSQL painNoSQL pain
NoSQL pain
 
Что такое говнокод
Что такое говнокодЧто такое говнокод
Что такое говнокод
 
Why everyone like ruby
Why everyone like rubyWhy everyone like ruby
Why everyone like ruby
 
В поисках удаленной работы за рубежом
В поисках удаленной работы за рубежомВ поисках удаленной работы за рубежом
В поисках удаленной работы за рубежом
 
Еще раз про качество
Еще раз про качествоЕще раз про качество
Еще раз про качество
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к Ansible
 
Чек-лист ежедневных действий для сообществ компаний в соц. сетях
Чек-лист ежедневных действий для сообществ компаний в соц. сетяхЧек-лист ежедневных действий для сообществ компаний в соц. сетях
Чек-лист ежедневных действий для сообществ компаний в соц. сетях
 
10 вопросов, которые следует задать будущему работодателю
10 вопросов, которые следует задать будущему работодателю10 вопросов, которые следует задать будущему работодателю
10 вопросов, которые следует задать будущему работодателю
 
Project Management в разрезе бихевиоризма и общей педагогики
Project Management в разрезе бихевиоризма и общей педагогикиProject Management в разрезе бихевиоризма и общей педагогики
Project Management в разрезе бихевиоризма и общей педагогики
 
Agile or not agile
Agile or not agileAgile or not agile
Agile or not agile
 
Ci на базе docker
Ci на базе dockerCi на базе docker
Ci на базе docker
 
Личный взгляд на Clojure
Личный взгляд на ClojureЛичный взгляд на Clojure
Личный взгляд на Clojure
 
Erlang, который мы потеряли
Erlang, который мы потерялиErlang, который мы потеряли
Erlang, который мы потеряли
 
Расстаемся с мифами о ФП
Расстаемся с мифами о ФП Расстаемся с мифами о ФП
Расстаемся с мифами о ФП
 

тесты с фикстурами

  • 2. Проблема мы пишем на Питоне (Руби, ПХП, Js…) язык не сигнализирует об ошибках None или Exception? слабая типизация нужно много тестов
  • 3. Пример Базовая авторизация: Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l username:password достать юзера в результате: ошибка разбиения строк ошибка декодирования ошибка разбиения строк (еще раз) исключение, если нет юзера
  • 4. xUnit JUnit – дедушка современных тест-систем портирован на все что можно прошел испытание временем не учитывает особенности целевой платформы
  • 5. Тесты на ООП – плохо связывание сущностей, наследование, миксины тесты каскадно отваливаются нет повторного использования кода огромные setUp
  • 6. Где-где падает? @patch("some.module.foo", Mock(...)) @patch("some.module.bar", Mock(...)) @patch("some.module.baz", Mock(...)) @patch("some.module.pip", Mock(...)) class MyTest(TestCase, MyMixin, CacheMixin): ... @override_settings(VALUE=42) @patch("other.module.func", Mock(...)) def test_ok(self): self.do_stuff() ...
  • 7. В сетапе, говоришь? def setUp(self): self.entity.user_requests_count = 0 self.entity.user = {} self.bar_user_goods_by_front_mock = Mock(return_value=(True, OTHER_DATA)) self.backend_user_mock = Mock(return_value=(True, BACKEND_MOCK)) self.baz_single = Mock(return_value=(True, TEST_SINGLE)) self.storage_mock = Mock(return_value=(200, STORAGE_DATA_NEW)) self.storage_new_mock = Mock(return_value=(200, FAKE_STORAGE)) self.shop_user_stats_mock = Mock(return_value=(True, TEST_USER_STATS_RESPONSE self.shop_mock = Mock(return_value=(True, TEST_LIST_RESPONSE)) self.user_mock = Mock(return_value=(True, TEST_EVENTS_USER_SHOP)) self.list_mock = Mock(return_value=(True, TEST_BAZ)) self.user_goods_mock = Mock(side_effect=lambda user_id, **kwargs: (True, {'go self.user_friends_mock = Mock(return_value=(200, [{'id': 1}, {'id': 2}, {'id' self.current_mock = Mock(return_value=(True, TEST_SOME_DATA)) self.test_mock = Mock(return_value=(True, {})) self.price_mock = Mock(return_value=(True, {'data': [TEST_OTHER_DATA]})) self.foo_mock = Mock(return_value=(400, None)) self.some_mock = Mock(return_value=(400, None)) self.user_money_mock = Mock(return_value=(200, TEST_USER_MONEY)) self.foo_some_mock = Mock(return_value=(True, TEST_USER_GOODS)) self.foo_some_goods_mock = Mock(return_value=(True, TEST_USER_GOODS_RESPONSE)
  • 8. Что такое тест? test = predicate(Environment)
  • 9. Надо так test = predicate(env1, env2, ... , envN)
  • 10. Получаются наборы test_ok = predicate(env1, env2) test_failture = predicate(env1) test_high_price = predicate(env1, env2, env3)
  • 12. Что такое фикстура? любой объект с тремя стадиями: инициализация участие в исполнении теста удаление def test_ok(fixture1, fixture2): ... f1 = fixture1() f2 = fixture1() test_ok(f1, f2) del f1 del f2 разный срок жизни функция модуль сеанс
  • 13. Преимущества тест – это функция однозначная зависимость от фикстур: def test_buy(user, goods, cache, auth) def test_auth_failture(user, auth) независимость тестов настоящее переиспользование кода
  • 14. REST-микросервис Фикстура – сервис авторизации не надо мокать, все запросы уходят в localhost app = Flask(__name__) @app.route("/user/auth") def endpoint_auth(requrest): return jsonify({ 'user': {'name': 'User Name', 'status': 'active'} }) @pytest.yield_fixture(scope="session") def fix_auth(): from multiprocess import Process p = Process(app.run, "127.0.0.1", 9001, True) p.start() yield app p.terminate()
  • 15. Изображения Фикстура для подготовки изображений @pytest.yield_fixture(scope="functions") def fix_avatar(): path = "~/some/path/avatar.png" avatar = PIL.Image(path) yield avatar os.unlink(path)
  • 16. Кеш Фикстура для чистого кеша @pytest.fixture(scope='function') def cache(request): _cache = django_cache _cache.clear() request.addfinalizer(_cache.clear) return _cache
  • 17. Параметрические фикстуры заменяют циклы легко добавить еще один случай справится ли приложение с аватарой 1x1, 128x1, 5000x5000? @pytest.fixture(scope="function", params=[(1, 1), (128, 1), (5000, 5000)]) def fix_avatar((w, h)): path = "~/some/path/avatar.png" avatar = PIL.Image(path, (w, h)) ...
  • 18. Выводы писать и поддерживать тесты стало легче меньше копипасты на борту фреймворка много других фишек слова коллеги, который с давно питоном: "не думал, что Пайтест меня так удивит"