我用以下方式构造了测试用例。
app
test_login.py
class1
test_11
test_12
test_function1.py
class2
test_21
test_22
当我运行“ pytest.exe应用”时,pytest能够识别所有测试用例,但它以随机顺序执行。例如,test11,test22,test12等
有什么办法可以更改此设置并首先在file :: class中执行所有测试用例,然后再移至另一个file :: class?
答案 0 :(得分:2)
它以随机顺序执行
默认情况下,测试是按模块排序的;在模块内部,将按照指定的顺序执行测试。因此,您应该像这样获得大致的订单:
$ pytest --collect-only -q
test_function1.py::class2::test_21
test_function1.py::class2::test_22
test_login.py::class1::test_11
test_login.py::class1::test_12
有什么办法可以更改此设置并首先在file :: class中执行所有测试用例,然后再移至另一个file :: class?
如果要更改默认执行顺序,可以在pytest_collection_modifyitems
挂钩中执行。该示例按类名然后按测试名对收集的测试进行重新排序:
# conftest.py
import operator
def pytest_collection_modifyitems(items):
items.sort(key=operator.attrgetter('cls.__name__', 'name'))
test_login
中的现在测试将在test_function1
中的测试之前执行,因为不再按顺序计算模块名称:
$ pytest --collect-only -q
test_login.py::class1::test_11
test_login.py::class1::test_12
test_function1.py::class2::test_21
test_function1.py::class2::test_22
答案 1 :(得分:0)
以下代码块解决了我的问题。感谢@hoefling的时间和帮助。
# conftest.py
@pytest.hookimpl(hookwrapper=True)
def pytest_collection_modifyitems(items):
yield
items.sort(key=operator.attrgetter('cls.__name__'))