Привет! В последнее время писал о том как можно использовать, генерировать тестовые данные при тестировании frontend и backend на примере формы feedback этого сайта. Не беру какие-то другие примеры со сторонних ресурсов, так как принцип один и тот же, да и мусор после тестов проще из своей бд чистить. Показать реальный проект над которым работаю не могу, да и тот набор технологий о котором писал и сегодня продолжу, у нас не используется. Раньше писал статьи про использование TestCafe Studio, но забросил по разным причинам, основная — хватает на работе. Пожалуй вступление немного затянулось и пора поставить цель сегодняшней заметки. Не обычно, но никакие данные сегодня отправлять в форму feedback не буду. Напишу простой тест который выполнит следующие проверки:

  1. форма содержит 4 (четыре) текстовых поля;
  2. текстовое поле для ввода телефона обязательно к заполнению;
  3. текстовое поле имеет ограничение по вводу равное 40 символам.

Результаты прогона теста просмотрим через Allure.

Инструменты которые буду использовать:

  1. среда разработки PyCharm c Python 3.8.3;
  2. Selenium WebDriver;
  3. адаптет geckodriver;
  4. тестовый фреймворк Pytest (основанная на Python среда тестирования);
  5. Allure Framework – инструмент построения отчётов автотестов.

Долго останавливаться на установке перечисленного в пунктах выше не буду. Установка PyCharm (1) — индиец в помощь.  Установка Selenium WebDriver (2) — узнать тут. Geckodriver (3) — лучше так или можно ещё так . Pytest (4) — перейти.

Устновка Allure. Есть два пути установки. Один — консольный, требующий предварительной установки в Win scoop , после установки выполнить scoop install allure. Так делал, уже не интересно (а вы попробуйте) и по этому пойду вторым — ручным путём. Скачать с репозитория последнюю версию Allure (2.7.0 на момент напсиания статьи). Разархивировал, положил папку allure-2.7.0 в корень диска D. Если устонавливать через консоль powershell, то система автоматически пропишет allure в PATH. Так как делаю это мануально, то надо теперь прописать путь до батника D:\allure-2.7.0\bin в переменную среды Windows.  Должно получится так как на скрине:

Чтобы убедиться что переменная  добавлена в среду откройте коноль cmd и выполните where allure. Должно выдать два пути. Аналогичную проверку в cmd можете сделать для geckodriver (where geckodriver).  Для работы с Allure в PyCharm надо установить библиотеку allure-pytest. На самом деле есть много способов установки библиотек в PyCharm. (из txt файла, интерфейса среды разработки и т.д.) Перейдите в терминал PyCharm, выполните: pip install allure-pytest

В Python буду использовать последние на дату написания статьи версии библиотек и не буду создавать виртуальной среду. Хоть надо завести себе такую привычку, как и начать пулить код из статей на GitHub.

Первое что сделаем — подключим необходимые библиотеки:

import pytest
from selenium import webdriver
import allure

Тут пояснять особо нечего. Подключили необходимые для работы библиотеки.

Далее, учитывая правила синтаксиса работы с pytest напишем фикстуру.

#подготовка состояние теста
@pytest.fixture
def preparation(request):
#инициализируем webdriver говорим что будем использовать firefox
    wd = webdriver.Firefox()
#открывать в полном окне
    wd.maximize_window()
#по завершению теста выходить (закрывать браузер)
    request.addfinalizer(wd.quit)
    return wd

Используется так называемый декоратор @pytest.fixture(). Сообщаем pytest, что функция c названием preparation является теперь фикстурой. Дальше будем включать имя фикстуры (preparation ) в список параметров нашей будущей тестовой функции и pytest будет выполнять запуск теста с учётом настроек которые прописал в preparation. А они: разворачивать окно браузера в полноэкранный режим, по завершению теста закрывать. Вообще фиксутры в pytest можно настраивать так чтобы они извлекали определённые данные, с которыми может дальше работать тест и это на самом деле очень круто.

Дальше напишем основную тестовую функцию. При помощи webdriver зайдём на сайт, откроем форму feedback, найдём селекторы, проверим согласно цели статьи поля. Код функции ниже, каждую строку кода прокомментировал.

def test_field(preparation):
#заходим на сайт
    preparation.get("http://artem.casa/")
#кликаем по ссылке (активируем форму) ПРИСЛАТЬ НОВОСТЬ
    preparation.find_element_by_xpath("//a[@class='send-news-title']").click()
#делаем неявную задержку на случай фризов для поиска селекторов
    preparation.implicitly_wait(10)
#ищем все текстовые поля в форме, записываем в переменную
    number_two = preparation.find_elements_by_xpath("//span/input")
#первая проверка на количество текстовых полей
    assert len(number_two) == 4
#ищем селектор поля Телефон
    tel = preparation.find_element_by_name("tel-3000")
#делаем проверку атрибутов для текстового поля Телфон
#проверка валидации к заполнению
    assert tel.get_attribute("aria-invalid") == "false"
#проверка максимальной длинны поля
    assert tel.get_attribute("size") == 40

Про поиск селекторов в dom-дереве писал. Assert позволяет проверять предположения о значениях произвольных данных. Сравнивал занесённые в переменные фактические значения атрибутов селектора поля с требованиями. На проекте эти требования могут быть к примеру в тестовой документации, где зафиксировано что текстовых полей формы должно быть 4 (четыре), максимально допустимая длинна символов для поля равна 40 и т.п.

Если объединить код подключения библиотек, фикстуры preparation с последним блоком то получим работающий тест, результаты которого мы увидим в консоли (passed или failed c причиной). Последний пункт моей цели — вывести результат работы теста через Allure.

Прикручивать allure буду к тесту test_field, в коде сделал пояснения:

#даём тесту название
@allure.title("Тест полей формы")
#присваиваем критичность тесту
@allure.severity(Severity.CRITICAL)
def test_field(preparation):
    preparation.get("http://artem.casa/")
#описываем шаги которые будут фиксироваться в allure в случае успеха или неудачи
    with allure.step("Клик по ссылке, активация формы"):
        preparation.find_element_by_xpath("//a[@class='send-news-title']").click()
        preparation.implicitly_wait(10)
        number_two = preparation.find_elements_by_xpath("//span/input")
    with allure.step("Проверка количества текстовых полей для ввода в форме"):
        assert len(number_two) == 4
        tel = preparation.find_element_by_name("tel-3000")
    with allure.step("Проверка обязательсности поля"):
        assert tel.get_attribute("aria-invalid") == "false"
    with allure.step("Проверка допустимой длины поля"):
        assert tel.get_attribute("size") == 40

Добавилась обёртка allure:

@allure.title("Тест полей формы")
@allure.severity(Severity.CRITICAL)

Добавилась конструкция with. Она используется для оборачивания выполнения блока инструкций менеджером контекста.

with allure.step("Клик по ссылке, активация формы"):

В блок импорта библиотек так же добавил

from allure_commons.types import Severity

для возможности добавлять информативные параметры критичности теста.

Итоговый рабочий код теста:

Содержание для зарегистрированных пользователей. Чтобы увидеть скрытую часть контента вам нужно зарегистрироваться или войти под своей учётной записью.

Для того чтобы сформировать отчёт в Allure надо запустить тест в консоли PyChar со следующими параметрами:

pytest test_one.py --alluredir=allure_results

Для формирования отчёта в консоли PyChar выполнить:

allure serve allure_results

Ниже небольшое короткое видео где покажу что представляет из себя отчёт:

Содержание для зарегистрированных пользователей. Чтобы увидеть скрытую часть контента вам нужно зарегистрироваться или войти под своей учётной записью.

Из ролика видно, что отчёты в Allure удобные, содержат достаточно информации, позволяют просматривать как зелёные, так и поспевшие после наката фиксов — красные, всеми нами любимые репорты тестов 🙂

На сегодня всё.