📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

4. Playwright c нуля: Фикстуры

German Vargin12:02

Transcription

Всем привет! Мы с вами на четвёртом уроке моего курса Play Right с нуля, и сегодня в этом уроке я вам покажу, как немного оптимизировать и укоротить наши тесты.

Если вы смотрели предыдущие уроки, то вы, наверное, уже обратили внимание, что во всех наших тестах есть код, который повторяется от теста к тесту. И вот эту вот строчку `page.goto('litres.ru')` мы пишем абсолютно в каждом тесте. Уже даже мне начинает это действовать на нервы. И если вы занимаетесь автоматизацией, то для вас это должно быть первой причиной, чтобы задуматься: "Так, а как мне написать вот этот вот код таким образом, чтобы мне не пришлось вызывать и писать одну и ту же строчку в каждом тесте? А тем более, если вдруг что-то у нас поменяется, и вот этот вот сайт изменится, или что-то там команду мы там дополнительно захотим сделать помимо открытия сайта в каждом тесте, то, ну, обидно будет это делать в каждом тесте. Хочется иметь какое-то отдельное одно место, где один раз это поменяли, и во все тесты это подхватилось."

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

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

Более наглядный пример может быть связан с авторизацией пользователей. Даже на нашем сайте litres можно выполнять какие-то действия с пользователем, который залогинен на сайте, можно делать действия с пользователем, который вот просто пришёл как гость. И вы можете написать фикстуру, которая будет содержать в себе код логина, авторизации на сайте, и помечать тесты таким образом, что если вам нужен тест с авторизованным пользователем, то он должен, а-а, быть прогнан именно с этой фикстурой. Если нет, тогда вы прогоняете тест без фикстуры.

В общем, давайте покажу на примере, как это выглядит. Кстати, мы уже с фикстурами работали. Вот эта вот конструкция `page: page` — это на самом деле тоже фикстура. Это фикстура, которая заранее предопределена в Playwright и позволяет нам работать, собственно, с браузером. Она создаёт вот этот объект браузер, запускает его, и мы уже можем открывать там страницы, выполнять какие-то действия, кликать на элементы. Всё это делается благодаря фикстуре.

Но чтобы это было работоспособно, отдельный код для этого? Да, у нас всё это сделано заранее. Давайте покажу вам на примере, как это выглядит. Сейчас одну секундочку. А чтобы написать фикстуру, нам нужно обратиться к Pytest, сделать `pytest.fixture`. Вот мне подсказывает, и просто определить функцию, которую мы хотим выполнить перед каждым тестом. Я назову её `open_litres`. Обратите внимание, это уже не тест. Да, здесь отдельная функция-фикстура, которую мы выполняем перед тестами. `open_litres(page: page)`. И вот здесь просто напросто я скажу, что нужно зайти на сайт, открыть вот эту вот страницу, и всё.

Теперь я могу вот эту вот строчку из тестов удалить. Удалил. И чтобы сказать тесту, какая фикстура мне ещё нужна, помимо `page`, можно через запятую сделать `open_litres`, то есть указать название вот этой вот функции, которую мы описали. Всё. Теперь у нас есть два теста, которые не содержат себе вот строчки `page.goto()`, но содержат фикстуру, и три теста, которые пока ещё работают по старому методу. Давайте я запущу наши тесты, посмотрим, что они отработают. Вот первый тест зашёл на сайт litres, зашёл, зашёл, вроде бы всё получается, да? Сейчас я подниму экран, чтобы вы заметили. Вот пять тестов, чуть меньше, чем 11 секунд, всё отработало, всё у нас хорошо.

Но смотрите, что у нас здесь происходит. А теперь мы, окей, убрали одну строчку, но нам надо в тесты передавать эту фикстуру, и всё равно, на мой взгляд, пока это не очень удобно, потому что мы абсолютно во всех тестах открываем вот эту вот страницу домашнюю, мы во всех тестах начинаем именно с неё, и хочется делать это без, опять же, лишних действий, не передавать через запятую вот эту вот конструкцию `open_litres`. И как это сделать? Тоже мы очень просто. Мы можем вот здесь вот в скобках на нашей фикстуре, она здесь или нет? Поэтому мы можем сейчас уже вот это вот убрать, оставить только `page`. Я надеюсь, теперь понятно, почему я не удалял вот эти вот строчки в других тестах. Давайте на этот раз я удалю, и у меня уже в этом файле не останется тестов, которые содержат себе вот эту вот лишнюю строчку кода. Всё, я так понимаю, сейчас должно отработать. Давайте мы ещё раз запустим наши тесты. Но судя по всему, всё работает, раз сайт отрабатывает, видите, что он открывается, да? Снова пять из пяти тестов пройдены, и всё работает.

Но что ещё мы можем сделать? Обратите внимание, у нас уже есть два файла. У нас есть ещё файл `test_titles`, который тоже содержит в себе эту строчку. И если мы просто так возьмём и удалим отсюда вот этот вот заход на нашу домашнюю страницу, то они не запустятся. Давайте я вам продемонстрирую. Сейчас мы запустим вот эти вот два теста, и всё. Вот у нас открывается браузер, но ни на какую страницу мы не переходим. Это потому, что Playwright не знает, какую страницу открыть, когда мы запускаем тесты из этого файла. То есть, та фикстура, которую мы писали, она действует только в рамках файла `test_pages`. Поэтому, давайте я сейчас закрою и покажу вам, как решить эту проблему. Для этого надо сделать отдельный файл и назвать его `conftest.py`. И здесь мы можем уже определить вот эту вот фикстуру, которая будет действовать вообще для всех файлов, для всех тестов. Сделаем её `from playwright.sync_api import sync_playwright`. И нам ещё надо импортировать, чтобы это заработало, `pytest`, потому что просто с фикстуры, я думаю, что он не заработает. Ну и давайте я скопирую код этой фикстуры сюда. Всё, вот так вот она скопирована. Теперь я могу её отсюда удалить. И давайте сейчас сделаю команду `clear`. И давайте я запущу вообще все тесты, которые у меня есть. Сейчас мы убедимся, что у нас нигде не осталось вот этих строчек. Так, `test_pages` я фикстуру убрал, и здесь захода на ссылку нету. И `test_titles` тоже домашней странички нету, фикстуры не определена. Запускаем. Находится семь тестов, и да, поехали. Всё, вот у нас 1, 2, 3. Я думаю, все семь тестов сейчас отработают. То есть, наша фикстура подтянулась, всё работает.

Теперь я доволен. Теперь все базовые действия, которые мне нужно сделать перед тестами, я могу определять здесь. Если мне нужно добавить фикстуру про того же авторизованного пользователя, я опять же могу это здесь добавить, не помечать её, например, `use_true`, и уже вызывать её в определённых тестах. В общем, стало гораздо удобнее, немножко мы оптимизировали. И теоретически, теоретически, можно даже поковырять, попробовать настроить работу Playwright таким образом, чтобы даже не передавать вот этот `page`, да, потому что, ну, на самом деле, это тоже фикстура, которую мы можем передать и задать по умолчанию как используемую во всех тестах. Делается это тоже очень просто. Есть такое ключевое слово `yield`, и мы можем передать вот этот вот объект `page` во все наши тесты. И таким образом, давайте я вот на вот этом примере покажу, мы вот это вот тоже можем убрать и оставить только `page`. То есть, теоретически, оно должно отработать. Давайте я вам покажу. Вот сейчас у нас два теста должны отработать, и всё хорошо. Да, даже без вот этого `page` оно работает.

Но здесь есть один минус, который мне не нравится. Например, если я хочу дальше что-то писать, и вот обратите внимание, `page.` — я делаю, у меня уже не подсказывает никакие методы, которые я могу использовать, когда делаю автоматизацию с помощью Playwright. Это потому, что он не понимает, что здесь будет использована фикстура, она будет погружаться уже в тесты динамически, и он не понимает. Поэтому мне не подсказывает. Если я добавлю вот сюда вот, например, обратно `page`, то обратите внимание, здесь я когда нажимаю точку, `page`, так, сейчас секундочку, да, этого что я вот здесь вот забыл, поэтому не подхватило, да, да, что ж такое, `page.` — и вот все вот эти вот методы, которые мы используем, они уже работают. Поэтому такая автоматизация, да, она уже лишняя. Может быть, как-то можно побороть Pytest, чтобы он понимал и знал, но у меня пока не получилось это сделать. Поэтому это то, чем я, в принципе, пожертвую. Ничего страшного, буду писать `page: page` во всех тестах, но при этом мне будет удобно писать тесты. Хотя теоретически работает и без этого.

В общем, всё, что хотел рассказать в этом видео сегодня. Спасибо, что смотрите, пишите ваши комментарии и до встречи на следующих уроках!