使用 py.test 以编程方式收集或创建测试

Fra*_*k T 5 python unit-testing pytest

我正在编写一个 pytest 插件来在运行它们之前对您的测试进行排序。我想要一种更好的方法来为我的插件编写测试。

我正在使用 pytest 的pytest_collection_modifyitems hook,然后items根据某些标记就地修改。测试这个最简单的方法是有一个 pytest 测试的输入列表,将它们传递给我的函数,并断言输出的顺序正确。

我在收集或创建输入测试列表时遇到问题。输入测试的格式应该与 pytest 传递itemspytest_collection_modifyitems钩子的格式相同,即它们应该是_pytest.python.Function定义了适当标记的实例。

我将接受以下任一答案:1) 收集给定现有 Python 模块的测试,或 2) 以编程方式创建_pytest.python.Function看起来像将传递给pytest_collection_modifyitems钩子的实例。任何可以轻松生成测试数据的东西。

Ana*_*kov 5

我建议您使用testdir固定装置采用更高级别的测试方法,这对于 pytest 插件很常见,并且可以通过pytester插件使用:

pytest_plugins = "pytester"


def test_something(testdir):
    """Test some thing."""
    testdir.makepyfile("""
        import pytest

        @pytest.mark.some
        def test_some():
            assert True

        @pytest.mark.some_thing_else
        def test_some_thing_else():
            assert True
    """)
    result = testdir.runpytest('-vv')
    assert result.stdout.lines[-4:-2] == [
        u'test_something.py::test_some PASSED',
        u'test_something.py::test_some_thing_else PASSED'
    ]
Run Code Online (Sandbox Code Playgroud)

因此,您可以轻松地在源代码中对测试及其标记进行多种排列,并通过断言输出行来断言实际的顺序。