В описании не очень понятно, как помощник считывает значения теста из БД или как этот помощник вызывается для получения значений для 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 запускает «фазу сбора» и подготавливает список тестов для запуска.