⬆️ Передача параметров командной строки в PyTest
И снова здарвствуйте! В это посте, который является продолжением Введения в Pytest я хотел бы рассказать как добавить гибкости вашим тестам с помощью параметров командной строки.
Допустим, мы хотим чтобы наш тест (из предыдущего поста) проверял на чётность не просто текущий таймстемп, а таймстемп плюс некоторое целое число, которое мы будем передавать в качестве параметра в тест. Чтобы это сделать, мы должны определить параметр командной строки, в который будет передаваться число. Для этого у pytest’а есть специальный метод “pytest_addoption”, который позволяет это сделать. Приводим conftest.py из предыдущего поста к такому виду:
import time import pytest def pytest_addoption(parser): """PyTest method for adding custom parameters.""" parser.addoption("--additional_value", action="store", default=0, type=int, required=False, help="Set additional value for timestamp") @pytest.fixture(scope="session") def additional_value(request): """Handler for --additional_value parameter.""" return request.config.getoption("--additional_value") @pytest.fixture(scope='class', autouse=True) def suite_data(): print("\n> Suite setup") yield print("> Suite teardown") @pytest.fixture(scope='function') def case_data(): print(" > Case setup") yield time.time() print("\n > Case teardown")
В функции pytest_addoption() мы объявляем необязательный (required=False) кастомный параметр типа integer (type=int) с дефолтным значением равным нулю (default=0), а функция additional_value() является, собственно, хэндлером значения. Каждый параметр, который вы добавите в pytest_addoption() должен иметь такой хэндлер, чтобы вы могли работать со значением параметра в своих тестах или других фикстурах.
Теперь изменим наш тест-кейс из предыдущего поста таким образом, чтобы он зависел от передаваемого значения:
import pytest class TestSuite(): def test_case_1(self, case_data, additional_value): timestamp = int(case_data) parameter = additional_value print(f" > Received from fixture timestamp is: {timestamp}") print(f" > Received from command line parameter is: {parameter}") timestamp += parameter assert(timestamp % 2 == 0)
Мы видим, что timestamp у нас нечётный (1630838805), но благодаря переданному значению (9) в сумме он стал чётным и тест PASSED.
Это очень синтетический пример, но, как мне кажется, достаточно понятный.
Параметров вы можете передавать сколько угодно, в нашем фреймворке мы используем около десятка. Это достаточно гибкий инструмент, который обычно удобнее, чем конфиги и позволяет быстрее конфигурировать запуск ваших тестов.