stepik-pytest

Проект по автоматизации тестирования с помощью Selenium & Python, написанный в стиле PageObject

Запуск тестов

Команда для запуска тестов для проверки задания:

pytest -v --tb=line --language=en -m need_review

Команда для запуска тестов в отдельном файле:

pytest -v --tb=line --language=en test_main_page.py

Опция PyTest --tb=line указывает, что нужно выводить только одну строку из лога каждого упавшего теста. Так вам будет проще разобраться в том, как выглядят сообщения об ошибках.

По умолчанию выбран браузер Chrome. Чтобы браузер не мелькал перед глазами, в файле conftest.py для Chrome добавлена опция 'headless' (строка 38) - если хочется увидеть действие тестов в браузере, эту строку необходимо закомментировать

Установка пакетов

Команда для сохранения всех версий пакетов в специальный файл requirements.txt:

pip3 freeze > requirements.txt

Команда для установки необходимых версий пакетов в новом активном окружении:

pip3 install -r requirements.txt

Теория

Файл base_page.py

Конструктор — метод, который вызывается, когда мы создаем объект. Конструктор объявляется ключевым словом "_ _ init _ _". В него в качестве параметров мы передаем экземпляр драйвера и url адрес. Внутри конструктора сохраняем эти данные как аттрибуты нашего класса.

Файл main_page.py

Класс MainPage(BasePage) будет иметь доступ ко всем атрибутам и методам своего класса-предка BasePage

class MainPage(BasePage):

def __init__(self, *args, **kwargs):
    super(MainPage, self).__init__(*args, **kwargs)

# Метод __init__ вызывается при создании объекта.
# Конструктор выше с ключевым словом super на самом деле только
# вызывает конструктор класса предка и передает ему все те аргументы,
# которые мы передали в конструктор MainPage.

Файлы test_main_page.py & test_product_page.py

Page Object Model или кратко Page Object — это паттерн программирования, который очень популярен в автоматизации тестирования и является одним из стандартов при автоматизации тестирования веб-продуктов.

Основная идея состоит в том, что каждую страницу веб-приложения можно описать в виде объекта класса. Способы взаимодействия пользователя со страницей можно описать с помощью методов класса.

В идеале тест, который будет использовать Page Object, должен описывать бизнес-логику тестового сценария и скрывать Selenium-методы взаимодействия с браузером и страницей.

В стиле PageObject:

  • нет assert в теле тестов
  • все действия и проверки выделены в отдельные методы внутри классов PageObject
  • все локаторы лежат в locators.py, их нет в коде страниц или тестов

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

  • setup — функция, которая выполнится перед запуском каждого теста из класса, обычно туда входит подготовка данных, и
  • teardown — функция, которая выполняется ПОСЛЕ каждого теста из класса, обычно там происходит удаление тех данных, которые мы создали во время теста.

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

Чтобы функция запускалась автоматически перед каждым тест-кейсом, нужно пометить её как @pytest.fixture с параметрами scope="function", что значит запускать на каждую функцию, и autouse=True, что значит запускать автоматически без явного вызова фикстуры.

Пример:

@pytest.fixture(scope="function", autouse=True)

def setup(self):

    self.product = ProductFactory(title = "Best book created by robot")
    self.link = self.product.link
    yield
    # после этого ключевого слова начинается teardown
    # выполнится после каждого теста в классе
    # удаляем те данные, которые мы создали 
    self.product.delete()