3

我必须读取一个 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 hook for row 作为参数所做的事情。我想知道如何对内部 for 循环函数做同样的事情 - 这个内部循环也应该作为测试用例收集

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)

现在,我需要为调用 test_method2 的 -for 循环生成报告(它是 csv 文件每一行中列中元素列表的参数化方法)。Pytest 也需要收集这些作为测试用例。

感谢您的帮助。谢谢

4

1 回答 1

7

您可能希望使用pytest_generate_tests()此处描述的钩子:https ://docs.pytest.org/en/stable/parametrize.html#pytest-generate-tests 这允许您读取 csv 文件并参数化您想要基于的测试关于它的内容。

更新

更新后的问题似乎并不完全清楚,但我假设您需要在一行和一列上测试一些东西。这只是要求进行两个测试:

def test_row(row):
    assert row  # or whatever

def test_column(col):
    assert col  # or whatever

现在剩下的就是为钩子创建参数化的固定装置rowcol使用它。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()

于 2014-02-21T13:09:54.427 回答