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

Python 使用py.test以编程方式收集或创建测试,python,unit-testing,pytest,Python,Unit Testing,Pytest,我正在编写一个pytest插件,以便在运行测试之前对其进行排序。我想要一个更好的方法来为我的插件编写测试 我正在使用pytest的pytest\u collection\u modifyitems,然后根据某些标记将项修改到位。测试这一点的最简单方法是拥有pytest测试的输入列表,将它们传递给我的函数,并断言输出的顺序正确 我在收集或创建输入测试列表时遇到问题。输入测试的格式应与pytest将作为项传递到pytest\u集合\u modifyitems钩子的格式相同,即它们应该是定义了适当标记

我正在编写一个pytest插件,以便在运行测试之前对其进行排序。我想要一个更好的方法来为我的插件编写测试

我正在使用pytest的
pytest\u collection\u modifyitems
,然后根据某些标记将
项修改到位。测试这一点的最简单方法是拥有pytest测试的输入列表,将它们传递给我的函数,并断言输出的顺序正确

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


我将接受以下回答:1)收集给定现有Python模块的测试,或2)以编程方式创建
\u pytest.Python.Function
实例,这些实例看起来像传递给
pytest\u collection\u modifyitems
钩子的实例。任何使生成测试数据变得容易的方法。

我建议您使用
testdir
fixture使用更高级别的测试方法,这是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'
    ]

这样,您可以很容易地在源代码中有多个排列的测试及其标记,并通过断言输出的行来确定实际的排序。

从PyTestV6.2开始,您可能需要考虑<代码> PyTytUs//Cult>夹具>代码> TestDIR < /C>。