自动化测试实例分享——《用例失败重试机制》

1. 背景说明
在开展自动化测试工作时,经常会由于一些外在原因(如网络中断、返回超时)导致自动化测试用例运行失败,而这些失败并不是用例本身验证或被测程序存在Bug而引起的,更可气的是这些失败场景有可能还是偶发的,为了保证测试用例运行的稳定性和验证有效性,我们需要一种针对失败用例重试的运行机制。

今天给大家分享的主题:自动化测试工作中,用例脚本失败重试机制的实现方式。

结合自动化测试框架来讲,用例运行失败重试机制,通常有三种形式来实现:

借助依赖框架自身是否有用例失败重试运行机制。

从用例脚本自身逻辑处入手,实现失败运行重试。(适用于被特殊处理过的用例逻辑)

从扩展框架源码,自定义失败重试运行机制。(通常适合于所有失败用例)

接下来,我们以Robot Framework框架为例,以具体的实战示例项目介绍如何实现用例失败重试机制。
2. 示例项目环境搭建
为了便于演示,重新创建一套新的虚拟隔离环境,用于搭建Robot Framework框架,操作步骤如下。

1、创建虚拟环境robotframework_env

python3 -m venv robotframework_env
2、激活虚拟环境

cd robotframework_env
source bin/activate

3、在虚拟环境中,安装robotframework、robotframework-ride库(安装最新即可)。

pip install robotframework
pip install robotframework-ride
如下图所示:
在这里插入图片描述
自动化软件测试交流群:642830685,领取最新软件测试资料大厂面试和Python自动化学习资料!一起学习交流
4、 输入命令:bin ./ride.py启动RIDE,如下图所示。
在这里插入图片描述
3. 创建实战示例项目
1、 创建trainning演示项目,并在项目下,创建失败重试机制实战目录,并依次创建测试套件、测试用例,示例结构如下:
在这里插入图片描述
2、 编写测试用例,测试用例逻辑如下:

*** Settings ***
Library Collections

*** Test Cases ***
Class_01_随机取数,模拟随机出现失败场景
@{list}= create list 1 2 3
r a n d o m n u m = E v a l u a t e r a n d o m . c h o i c e ( {random_num}= Evaluate random.choice( randomnum=Evaluaterandom.choice({list}) random
log ${random_num}
should be true r a n d o m n u m = = 2 在 测 试 用 例 中 , 先 通 过 c r e a t e l i s t 关 键 字 创 建 了 一 个 名 称 为 {random_num}==2 在测试用例中,先通过create list关键字创建了一个名称为 randomnum==2createlist{list}的列表变量,并依次存入1、2、3三个元素。
再通过Evaluate万能关键字,结合random.chocie方法,从 l i s t 列 表 中 随 机 取 出 一 个 整 型 元 素 , 保 存 到 名 称 为 {list}列表中随机取出一个整型元素,保存到名称为 list{random_num}变量中。
最后,通过should be true关键字,断言 r a n d o m n u m 变 量 等 于 2 , 由 于 第 二 步 的 随 机 取 值 , 会 让 {random_num}变量等于2,由于第二步的随机取值,会让 randomnum2,{random_num}变量值具有随机性(可能等于2,也可能是1或3),从而实现模拟一条随机失败的用例场景。
运行成功结果:
在这里插入图片描述
运行失败结果:
在这里插入图片描述
4. 用例失败重试机制实现
Robot Framework 官方并没有提供类似retry等参数来配置失败用例重执行。仅仅提供了–rerunfailed参数对基于结果文件output.xml来选择重新执行失败的用例。

4.1 基于RF框架自身的重试机制
1、 以第3节中新建的示例项目为例,为了便于演示,以命令行来操作,在命令行中输入执行用例命令,并且将输出文件保存到original.xml文件中。

robot --output original.xml .
在这里插入图片描述
2、 重新运行测试用例,并将第二次运行的结果文件输出保存到rerun.xml文件中。
robot --output rerun.xml --rerunfailed original.xml .
在这里插入图片描述
3、合并两次运行的结果输出文件。
rebot --merge original.xml rerun.xml
在这里插入图片描述
在Robot Framework中除了有–rerunfailed参数针对失败的测试用例外,也有针对测试套件的–rerunfailedsuites,参数详细说明如下:
-R --rerunfailed output Select failed tests from an earlier output file to be
re-executed. Equivalent to selecting same tests
individually using --test option.


-S --rerunfailedsuites output Select failed suite from an earlier output file
to be re-executed. New in RF 3.0.1.
-R或–rerunfailed参数非常有用,它的作用是从output file中选择失败的用例重跑。但是有个问题,如果上一次运行时用例全部成功,此时加上-R参数再去运行用例时会报错: failed: All tests passed ,这导致我没办法在jenkins job中使用这个参数。

-S或–rerunfailedsuites参数和-R参数的作用类似,它的作用是从output file中选择失败的用例套件重跑。
4.2 基于用例脚本逻辑重试机制
第二种方法,我们介绍,如何基于用例脚本逻辑特殊改造,实现用例失败后的重试机制。

基于用例逻辑增加重试机制,核心实现思路:基于RF内置变量${TEST_STATUS}获取用例运行结果,再结合Teardown运行改造后的关键字逻辑即可。

操作如下:

1、对示例1中的Class_01测试用例进行改造,抽取用例逻辑部分,存放到单独的关键字下,名称如测试用例关键字。
** Keywords ***
测试用例关键字
@{list}= create list 1 2 2
r a n d o m n u m = E v a l u a t e r a n d o m . c h o i c e ( {random_num}= Evaluate random.choice( randomnum=Evaluaterandom.choice({list}) random
log ${random_num}
should be true ${random_num}==2
2、 添加关键字用例重试机制,增加用例重试机制的处理逻辑:

 *** Keywords ***

用例重试机制
[Arguments] ${times}
${status}= set variable ${TEST STATUS}
FOR ${index} IN RANGE t i m e s l o g 第 {times} log 第 timeslog{index+1}运行结果: s t a t u s E x i t F o r l o o p i f ′ {status} Exit For loop if ' statusExitForloopif{status}’==‘PASS’ or ' s t a t u s ′ = = ′ T r u e ′ l o g 第 {status}'=='True' log 第 status==Truelog{index+1}次重试运行
s t a t u s = R u n k e y w o r d A n d R e t u r n S t a t u s 测 试 用 例 关 键 字 E N D 在 用 例 重 试 机 制 关 键 字 中 , 先 通 过 {status}= Run keyword And Return Status 测试用例关键字 END 在用例重试机制关键字中,先通过 status=RunkeywordAndReturnStatusEND{TEST STATUS}内置变量,获取用例执行结果,并且接收变量${times}用于控制重试次数,如果用例执行状态等于PASS则直接退出重试,否则调用Run keyword And Return Status关键字继续运行测试用例。

3、为了便于演示,增加一条名称为Class_02测试用例,内容如下:
Class_02_随机取数,模拟随机出现失败场景
测试用例关键字
[Teardown] run keyword 用例重试机制 5
到此, 我们已经在用例逻辑层面实现了用例失败重试机制了。

PS: 针对用例逻辑层面实现重试机制,也可以采用关键字: Wait Until Keyword Succeeds,读者可根据自身需求进行改造,本文的用例重试机制并不是唯一的方法。
4.3 基于框架源码实现重试机制
除了上述两种方法,最后一种方法是基于框架层面进行改造,增加全局重试机制,

通过改写Robot Framework源代码增加–retry选项,实现test级别的失败用例自动再执行,比如用例失败后,会重新运行N次,直至成功or 耗尽重试次数,生成的日志和报告文件中只会体现最后一次执行的结果。

类似如下命令格式:
robot --retry 3 trainning
具体实现:

1、修改文件 : robotframework_env/lib/python3.7/site-packages/robot/run.py,在USAGE变量里添加retry参数。
-F --extension value Parse only files with this extension when executing
a directory. Has no effect when running individual
files or when using resource files. If more than one
extension is needed, separate them with a colon.
Examples: --extension txt, --extension robot:txt
New in RF 3.0.1. Starting from RF 3.2 only *.robot
files are parsed by default.
-N --name name Set the name of the top level suite. By default the
name is created based on the executed file or
directory.
-H --retry retry   Set the retry times if test failed.
2、在run.py文件,RobotFramework类增加make方法,并在开始之前导入库from xml.dom import minidom。
def make(self, outxml):
xmldoc = minidom.parse(outxml)
suiteElementList = xmldoc.getElementsByTagName(‘suite’)
mySuite = []
for suiteElement in suiteElementList:
if suiteElement.childNodes is not None:
for element in suiteElement.childNodes:
if element.nodeName == ‘test’:
mySuite.append(suiteElement)
break
for suite in mySuite:
testElements = {}
for element in suite.childNodes:
if element.nodeName == ‘test’:
name = element.getAttribute(‘name’)
if testElements.get(name) == None:
testElements.update({name: [element]})
else:
testElements.get(name).append(element)
for n, el in testElements.items():
for i in el[0:-1]:
textElement = i.nextSibling
suite.removeChild(i)
suite.removeChild(textElement)
savefile = open(outxml, ‘w’)
root = xmldoc.documentElement
root.writexml(savefile)
savefile.close()
3、RobotFramework类的main方法,加入红色内容 self.make(settings.output)
在这里插入图片描述
4、 打开robot/conf/setting.py文件,修改_cli_opts字典,增加’Retry’: (‘retry’, 3),,如下所示:
在这里插入图片描述
5、打开robot/model/itemlist.py文件,修改visit方法:
def visit(self, visitor):
for item in self:
if self.module == ‘robot.model.testcase’ and hasattr(visitor, “_context”):
testStatus = ‘’
for i in range(0, int(visitor._settings._opts[‘Retry’])):
if testStatus != ‘PASS’:
if item.name in visitor._executed_tests:
visitor._executed_tests.pop(item.name)
item.visit(visitor)
testStatus = visitor._context.variables[’${PREV_TEST_STATUS}’]
else:
break
else:
item.visit(visitor)
6、做完如上配置之后,我们来验证一下参数是否配置成功了,输入robot —help查看一下配置参数项。
在这里插入图片描述
7、 输入如下命令,结合Class_01用例,验证用例失败重试机制:

robot --test Class_01_随机取数,模拟随机出现失败场景 --retry 3 .
在这里插入图片描述
如果测试用例运行结果为PASS,运行一次即正常结束,如果用例运行失败,则会重试3次执行。
5. 小结
本文以Robot Framework框架为例,介绍了在自动化测试过程中,如何实现用例脚本失败重试机制,并且分享了三类实现思路:

借助依赖框架自身是否有用例失败重试运行机制。

从用例脚本自身逻辑处入手,实现失败运行重试。(适用于被特殊处理过的用例逻辑)

从扩展框架源码,自定义失败重试运行机制。(通常适合于所有失败用例)

认真品味本文的读者,会发现,虽然本文内容是以Robot Framework框架为例,但其实任何自动化测试框架,要实现测试用例脚本重试机制,都绕不开本文所提到的三类实现方式思路。学会变通、灵活运用才是王道。

希望对大家在实施自动化测试工作当中有所帮助或启发!如果觉得有用,不用以身相许,关注一下就行。
自动化软件测试交流群:642830685,领取最新软件测试资料大厂面试和Python自动化学习资料!一起学习交流

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值