Параметризация тестов pytest с помощью приборов и аргумента командной строки
Попытка перенести аргумент командной строки (table_name) в pytest (через conftest.py, см. Ниже) и использовать этот аргумент в вспомогательном методе для создания запроса в БД, а затем использовать результаты запроса для создания параметризованных входных данных теста, используя @pytest.mark.parametrize для функции test_.
#contents of conftest.py
import pytest
def pytest_addoption(parser):
parser.addoption("--table_name", action="store", default=None, help="enter table name")
@pytest.fixture
def table_name(request):
return request.config.getoption('--table_name')
Проблема в том, что аргумент командной строки (table_name) извлекается с помощью фиксатора, и мы хотели бы передать его во вспомогательный метод, чтобы сделать запрос и поместить результаты запроса в список, но поскольку вспомогательный метод принимает фиксатор, он не может быть вызван вне другого прибора / test_function. Таким образом, мы не можем поместить список в параметризованные параметры test_function
#helper method
def get_test_cases(table_name):
#connect to DB, makes query
#puts all query results into a list called tests
return tests
#test function
@pytest.mark.parametrize("columns...", (values...)) #list is read as values
def test_function(columns):
#assertion tests
Есть ли способ использовать аргумент командной строки, а также передать результаты запроса БД в параметризованный маркер / параметры?
1 ответ
В описании не очень понятно, как помощник считывает тестовые значения из БД или как этот помощник вызывается для получения значений для pytest.mark.parameterize()
, но если помощник способен получить один тестовый случай за вызов (а не весь список сразу), то вы можете сделать сам помощник фиксатором и вызывать его несколько раз, по одному разу для каждого тестового случая, указанного в списке. @pytest.mark.parametrize() оформление. Скажем, в базе данных каждый тестовый случай находится в строке БД, и вы индексируете его по некоторому столбцу "идентификатор теста".
@pytest.fixture
def test_case(request,table_name):
# this is the get-test-case helper, note it is a fixture,
# so it can have table_name as an argument
# request.param will be our test ID here, see the mark.parametrize below
return query("select * from %s where test_id = %s",
(table_name, request.param))
@pytest.mark.parametrize("test_case,p1,p2",
[ ("TstID1", 1, 2), ("TstID2", 3, 3) ], indirect=["test_case"])
def test_function(test_case, p1, p2):
# test_case here will be the query result from the call to the test_case() fixture! p1 and p2 will come directly from the parameterize mark.
Обратите внимание, как обычные параметры p1 и p2 передаются как есть, но тот, который помечен как косвенный, проходит через фиксатор (это также гарантирует, что "дорогая" операция запроса к базе данных выполняется, когда тесты действительно выполняются, а не когда pytest запускает "фазу сбора" и подготавливает список тестов для запуска.