⬆️ Передача параметров командной строки в 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.
Это очень синтетический пример, но, как мне кажется, достаточно понятный.
Параметров вы можете передавать сколько угодно, в нашем фреймворке мы используем около десятка. Это достаточно гибкий инструмент, который обычно удобнее, чем конфиги и позволяет быстрее конфигурировать запуск ваших тестов.