Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Все точки над И - разбираем фикстуры pytest

pytest
python
Теги: #<Tag:0x00007f7b621a7838> #<Tag:0x00007f7b621a76d0>

(Goshko Nazar) #1

Понадобилось мне тут в одном из модулей запустить для каждого теста фикстуры, и чет я приуныл - не совсем понимаю как организовать их по умному.

О самой проблеме:
Надо оттестить функциональность логинизации, соответвенно нужна фикстура которая по окончанию теста, разлогинится из системы.
вторая - есть наборы тестов, для каждого из типов юзеров, как запилить фикстуру что бы по аргументу командной строки, запускались только определенные тесты (вроде разобрался - надо сделать помеченную фикстуру как я понял.) …но кому не тяжко, приложите реальный вариант.

При этом всем, желательно что бы фикстуры можно было задавать как декоратор, так как у меня есть еще глобальные фикстуры самого драйвера и модели.

Все тесты пишутся по пейдж обджекту, в аргумент которых приходит модель приложения.


(ArtemIljin) #2

я сейчас активно разбираюсь с py.test. Все началось с этой статьи: http://habrahabr.ru/company/yandex/blog/242795/
Бегу по граблям pytest и Django


(Goshko Nazar) #3

если честно, плохая статья…все сразу и нечего толком, читал как то давно. А насчет джанго там есть отдельный модуль для написания тестов под нее

Проблема в общем то решена, на данном этапе.


(ArtemIljin) #4

да, модуль есть. Но у меня ещё задача как можно дешевле перевести существующие тесты на рельсы py.test. С этим есть ряд неожиданных проблем.
Статья - не ответ на ваш вопрос, это да.
Может поделитесь ссылками, которые помогли решить вашу прблему?


(Goshko Nazar) #5

зависит от того в каком виде ваши тесты. Где то был тут мой давний вопрос по переходу с юниттест на пайтест, где я решал проблему запущенного драйвера раз на сессию, без переписывания всех тестов, их там около 200.

Вы опишите какие трудности вас останавливат, мож че решим)

Заранее только могу сказать что дешевле писать хорошо тесты, что впрочем мине и помогло в переходе очень…Все тесты и подготовка, должна в РАВНОЙ мере быть отделена от тестов, иначе потом начинается что фиксура что то недовыполняет, и нужно это делать в тесте.

Если у вас джанга, то, возможно вам стоит переписать все под глобал фикстуру запуска сервера и базы,
Классовые фикстуры это переход на какую то страницу с функциональностями, и да, фикстуру желательно делать параметризированную, понимаю, это как то паршивит концепцию - зато все выглядит ровно.


(ArtemIljin) #6

На самом деле при переходе на pytest возникло две странные проблемы: 1. Активно стала появляться ошибка 429, это решилось прописыванием Dummy кэша от Django. и проблема №2 (зависимая от того, как написан проект и конкретные тесты). Первую решили быстро, а со второй боремся пока. По итогу из 300 тестов падают 2, что в целом неплохой результат.
Плюс мы не работаем с Selenium, так что войны проходят на разделе - интеграционные-функциональные тесты.
Если чего интересного нарою - дам знать.


(Oleksii Burdin) #7

Уважаемый топикстартер, не могли бы вы приложить свой пример решения.
Моя проблема схожая: в тесте создается юзер, и по завершению теста хотелось бы его удалить.
Заранее спс!


(Goshko Nazar) #8

Для начала нужно уточнить, как создается юзер, и насколько времени он нужен, потому что при зарытии драйвера, вы автоматически разлогинитесь, если не делаете магию с куками.
Напомню, фикстуры можно вызывать друг из друга,
Есть несколько вариантов, и они зависят от того, как вы используете драйвер, далее будет просто логинизация:.

  1. логин нужен на каждый тест свой, веб драйвер один на всю сессию
  • нужна полная фикстура с параметром

    @pytest.fixture()
    def log_out(app, log_pass):
    app.home_page.profile_menu.log_in(log_pass)
    def fin():
    app.home_page.profile_menu.log_out()
    request.addfinalizer(fin)

  1. логин нужен один на все тесты - делаем session фикстуру, аналогичную той, что запускает у вас драйвер.
  2. Нужен или логин или разлогин раз на тест - используем код и пункта 1, где пред действия - все что до объявления ф-и fin, пост действия - fin функция

Фикстуры можно комбинировать, например при сложной иерархии учеток (админ, не админ, пользователь, и другие), удобно в объекте приложения описывать ВЕСЬ функционал, и писать тесты ВСЕ возможные, а вот потом, спец фикстурами их просто помечать согласно доступам, и запускать по ключу. Уникальные, естественно отделять как нужно.

Пока, для тестирования моей, подобной системы обучения, где куча много всяких рангов юзеров, я ничего лучше не придумал.