pytest 默认按照 py 文件内的用例编写顺序来执行。
⚠️ unittest 会自动按照 ascii 码排序:小写英文—>大写英文—>0-9数字
通过插件可以改变测试用例的执行顺序,安装方法如下:
$ pip install pytest-ordering
用法:@pytest.mark.run(order=1)
具体的用法这里不多赘述,网上很多教程。
这里只是记录下,实际应用过程中由于没有理解排序机制导致出现的问题。
⚠️
注意:通过这种方法设置的用例排序是全局的‼️
# a.py
@pytest.mark.run(order=1)
def test_01():
pass
@pytest.mark.run(order=2)
def test_02():
pass
# b.py
@pytest.mark.run(order=1)
def test_03():
pass
@pytest.mark.run(order=2)
def test_04():
pass
上面的测试用例执行顺序是:
> test_01()
> test_03()
> test_02()
> test_04()
先执行完全部 order=1 的用例,然后才会执行 order=2 的用例。
我理解的是按 order 排序执行完 a.py 的全部用例后再去按顺序执行 b.py 的用例,这是错误的理解。
我遇到的问题。
- a.py 和 b.py 这两个用例文件都通过 setup_class() 初始化了一个随机值
- 预期 a.py 随机值在 test_01() 和 test_02() 是通用的
- 预期 b.py 随机值在 test_03() 和 test_04() 是通用的
在我执行全部 case 的时候,a.py 执行完 test_01() 后,在执行 test_02() 时,随机值又被初始化了一次,这与 setup_class 类初始化一次的逻辑不太符合呀,百思不得其解。
一步一步的排查,才发现通过 order 指定了顺序导致。
- a.py --> setup_class() --> test_01()
- b.py --> setup_class() --> test_03()
- a.py --> setup_class() --> test_02() # 这里又初始化了,导致随机值变了
- b.py --> setup_class() --> test_04() # 这里又初始化了,导致随机值变了
设置 order 时:
取消 order 后: