Pytest параметризация - строка из CSV в качестве тестового примера
Я должен прочитать файл CSV и для каждой комбинации в каждой строке нужно запустить несколько методов. Я хотел бы видеть каждую строку в качестве контрольного примера. Можно ли отправить строку в качестве параметра - pytest параметризовать мой контрольный пример? Можете ли вы дать мне некоторое представление о том, как это сделать?
Вот псевдокод:
class test_mytest:
def test_rows:
for row in csvreader:
run_method(row)
for onecol in row:
run_method2(onecol)
Я пытался читать pytest
документация, но это было не ясно для меня.
Вот что я делаю для использования перехватчика generate_tests для строки в качестве параметра. Я хотел бы знать, как сделать то же самое для внутренней функции цикла - этот внутренний цикл также должен быть собран в качестве контрольного примера
def pytest_generate_tests(metafunc):
read_csvrows()
for funcargs in metafunc.cls.params[metafunc.function.__name__]:
# schedule a new test function run with applied **funcargs
metafunc.addcall(funcargs=funcargs)
class TestClass:
params = {
'test_rows': rows,
}
def test_rows:
run_method(row)
for onecol in row:
test_method2(onecol)
Теперь мне нужно сгенерировать отчеты для цикла -for, вызывающего test_method2 (это параметризованный метод для списка элементов в столбце в каждой строке CSV-файла). Pytest также должен собрать их в качестве тестового примера.
Ценю вашу помощь. Спасибо
1 ответ
Вы, вероятно, захотите использовать pytest_generate_tests()
подключите, как описано здесь: https://docs.pytest.org/en/latest/parametrize.html. Это позволяет вам прочитать файл csv и параметризовать тесты, которые вы хотите, основываясь на его содержимом.
Обновление:
Обновленный вопрос кажется не совсем понятным, но я предполагаю, что вам нужно что-то тестировать как в строке, так и в столбце. Это просто требует двух тестов:
def test_row(row):
assert row # or whatever
def test_column(col):
assert col # or whatever
Теперь остается только создать параметризованные приборы для row
а также col
с использованием pytest_generate_tests()
крюк. Так что в conftest.py
файл:
def test_generate_tests(metafunc):
rows = read_csvrows()
if 'row' in metafunc.fixturenames:
metafunc.parametrize('row', rows)
if 'col' in metafunc.fixturenames:
metafunc.parametrize('col', list(itertools.chain(*rows)))
Обратите внимание на использование рекомендуемого metafunc.parametrize()
функция вместо устаревшей metafunc.addcall()