Bootstrap

pytest-ordering 测试用例排序

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 后:
在这里插入图片描述

;