pytest指定执行顺序,pytest运行指定用例

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: