Команда для запуска тестов для проверки задания:
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()