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()

Другие вопросы по тегам