对pytest的测试用例运行顺序想做一下调整,在使用pytest_collection_modifyitems的过程中掉到一个坑里,特此记录一下。
需求
- 简化后的需求就是,希望pytest按照原来的反序执行测试用例
- 通过pytest_collection_modifyitems来实现
- 不用pytest-ordering,是因为不想把这个顺序写死在case里
- 脚本
$ cat test.py
import pytest
class TestDemoA:
def test_A_003(self):
print "### 003"
def test_A_001(self):
print "### 001"
def test_A_004(self):
print "### 004"
def test_A_002(self):
print "### 002"
- 运行结果,可以看到是按照文件写入测试用例的顺序执行的
$ pytest test.py -s
============================================================================================================ test session starts ============================================================================================================
platform linux2 -- Python 2.7.17, pytest-4.6.11, py-1.10.0, pluggy-0.13.1
rootdir: /home/centec/test
collected 4 items
test.py ### 003
.### 001
.### 004
.### 002
.
========================================================================================================= 4 passed in 0.01 seconds ==========================================================================================================
尝试
- 网上搜了几篇讲pytest_collection_modifyitems的文章,都是说改一下items就行了
- 于是添加了conftest.py
$ cat conftest.py
import pytest
def pytest_collection_modifyitems(session, config, items):
items = items[::-1]
print items
- 运行发现items的顺序确实反过来了,但是执行顺序
并没有改变!
$ pytest test.py -s
============================================================================================================ test session starts ============================================================================================================
platform linux2 -- Python 2.7.17, pytest-4.6.11, py-1.10.0, pluggy-0.13.1
rootdir: /home/centec/test
collecting ... [<Function test_A_002>, <Function test_A_004>, <Function test_A_001>, <Function test_A_003>]
collected 4 items
test.py ### 003
.### 001
.### 004
.### 002
.
========================================================================================================= 4 passed in 0.01 seconds ==========================================================================================================
问题定位
>>> a=[3,1,4,2]
>>> id(a)
139800452051904
>>>
>>> a=a[::-1]
>>> a
[2, 4, 1, 3]
>>> id(a)
139800452053344
>>>
>>> b=[3,1,4,2]
>>> id(b)
140105279067072
>>>
>>> b[:]=b[::-1]
>>> b
[2, 4, 1, 3]
>>> id(b)
140105279067072
>>>
- 结论就是不能改变items本身(其实就是指针),只能改变items列表中的值
修改
$ cat conftest.py
import pytest
def pytest_collection_modifyitems(session, config, items):
items[:] = items[::-1]
print items
$ pytest test.py -s
============================================================================================================ test session starts ============================================================================================================
platform linux2 -- Python 2.7.17, pytest-4.6.11, py-1.10.0, pluggy-0.13.1
rootdir: /home/centec/test
collecting ... [<Function test_A_002>, <Function test_A_004>, <Function test_A_001>, <Function test_A_003>]
collected 4 items
test.py ### 002
.### 004
.### 001
.### 003
.
========================================================================================================= 4 passed in 0.01 seconds ==========================================================================================================
|