камплюхтеры
September 5, 2021

⬆️ Передача параметров командной строки в 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.

Это очень синтетический пример, но, как мне кажется, достаточно понятный.

Параметров вы можете передавать сколько угодно, в нашем фреймворке мы используем около десятка. Это достаточно гибкий инструмент, который обычно удобнее, чем конфиги и позволяет быстрее конфигурировать запуск ваших тестов.