pytest指定执行顺序,pytest运行指定用例
Pytest修改测试用例的执行顺序(hook函数:pytest _ collection _ modify items)_ MB 62 af F3 AFB 54 FB _ 51 c的技术博客TO blog
前言pytest默认执行案例是根据项目下的文件名按照ascii码收集并运行;文件中的用例从上到下依次执行。
函数py _ collection _ modifyitems,顾名思义,收集测试用例并改变它们的执行顺序。
严格来说,在用例设计的原则上,我们不需要用例有依赖顺序,这样才能更好的体现测试用例的意义。(测试用例的执行不需要按顺序执行,而是立即执行)]
1.Hook方法的pytest _ collection _ modify items:pytest _ collection _ modify items在测试用例集合后调用,可以用来调整测试用例的执行顺序;
它有三个参数,分别是:
Session:会话对象;
Config:配置对象;
条目:用例对象列表;改变条目中用例的顺序可以改变用例的执行顺序。
这三个参数的作用不同,都可以独立使用。修改用例的执行顺序,主要使用items参数【在用例执行之前,收集到的测试用例会以元素对象的形式存储在用例对象列表中】2。pytest_collection_modifyitems方法源代码:def pytest _ collection _ modify items(session,config,items):
在执行收集后调用,可以过滤或重新排序
物品就位。
:param _pytest.main.Session会话:pytest会话对象
:param _pytest.config.Config配置:pytest配置对象
:param List[_ pytest . nodes . item]items:item对象列表
首先,为一个单独的test.py文件修改测试用例的执行顺序。首先,准备三个测试用例:
导入pytest
TestDemoA类:
def test_A_001(自身):
及格
def test_A_002(自身):
及格
def test_A_003(自身):
及格
if __name__==__main__ :
Pytest.main([-s])正常情况下,Pytest会从上到下执行(模块级会先按照ascii码按模块名排序):
使用pytest_collection_modifyitems来修改单个测试文件中用例的执行顺序。在conftest.py文件中使用py test _ collection _ modify items hook方法:
# conftest.py
#直到测试用例收集完毕才会执行。
def pytest _ collection _ modify items(items):
打印(由“pytest: \n”,items收集的所有测试用例)
if __name__==__main__ :
Py.main ([-s])可以看到,收集到的三个测试用例是在控制台中打印出来的,它们是在测试用例执行之前收集的;[首先收集测试用例,然后执行它们]
只有在pytest_collection_modifyitems执行后,才显示已经收集了三个用例;
如果我们调整pytest_collection_modifyitems中的用例,会影响用例是否执行以及执行的顺序;
使用条目来获得收集的用例名称和用例节点:# conftest.py
def pytest _ collection _ modify items(items):
打印(由“pytest: \n”,items收集的所有测试用例)
对于项目中的项目:
打印(- * 10)
打印(用例名称:,item.name)
打印(用例节点:,item.nodeid)
if __name__==__main__ :
Test.main ([-s])运行结果:
修改用例的执行顺序,拒绝测试用例:# conftest.py
def pytest _ collection _ modify items(items):
#取出示例名称并将其存储在新列表new_items中
new_items=[]
对于项目中的项目:
新项目追加(项目名称)
# 1.删除test_A_002用例
#获取新列表中test_A_002的索引
index _ 2=new _ items . index( test _ A _ 002 )
#删除旧列表中的此索引
删除项目[index_2]
Del _ items [index _ 2] #新列表将同步删除,旧列表保持同步。
# 2.交换1和3的顺序
#获取新列表中1和3的索引
index _ 1=new _ items . index( test _ A _ 001 )
index _ 3=new _ items . index( test _ A _ 003 )
#根据索引交换旧列表中的位置
Items [index _ 1],items [index _ 3]=items [index _ 3],items [index _ 1]运行结果:
可以看到,在控制台的输出结果中,用例3和用例1的顺序颠倒了,用例2因为被删除而没有被执行;
代码比较粗糙,但思路是这样的:尽量干扰条目列表中用例对象的排序;
第二,根据多重测试的默认执行顺序,设计一个简单的pytest项目。文件pytest。有两个包A和B,测试用例分别写在test_a.py和test_b.py中。
Conftest.py内容:
导入pytest
def pytest _ collection _ modify items(会话,项目):
打印(收集的测试用例:%s%items)test_a.py内容:
def测试_a_1():
打印(“测试用例a_1”)
def测试_a_2():
打印(测试用例a_2)test_b.py内容:
定义测试_b_2():
打印(“测试用例b_2”)
定义测试_b_1():
在print (test case b_1 )运行后,可以看到收集到的测试用例[将在测试用例开始执行前收集]:
从结果中可以看出,在运行时,模块是通过ascii码收集的,单个py文件中的用例是按照从上到下写的顺序收集的。
条目排序如果我想改变上述用例的执行顺序,就按所有用例名称(测试方法名称)的ascii码排序。
首先获取收集到的用例的名称,并按照用例名称进行排序。
def pytest _ collection _ modify items(会话,项目):
打印(类型(项目))
打印(收集的测试用例:%s% items )
# sort sort,根据用例名称item.name的ASCII代码排序
items.sort(key=lambda x: x.name)
打印(排序的用例:%s% items )
对于项目中的项目:
打印后的结果(用例名称:%s% item.name )被重新执行:
重新排序后,可以根据用例名称的ascii码序列执行。
期待陌生,拥抱惊喜。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。