在pytest

时间:2018-08-10 03:24:50

标签: python testing pytest

我用以下方式构造了测试用例。

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?

2 个答案:

答案 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__'))