параметризация тестов pytest с помощью приборов и аргумента командной строки - PullRequest
0 голосов
/ 27 июня 2018

Попытка перенести аргумент командной строки (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

Есть ли способ использовать аргумент командной строки, а также передать результаты запроса БД в параметризованный маркер / params?

1 Ответ

0 голосов
/ 28 июня 2018

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

...