自动化测试实战技巧:「用例失败重试机制」实现方案分享

简介: 自动化测试实战技巧:「用例失败重试机制」实现方案分享

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

如下图所示:

微信图片_20220524162911.png

4、 输入命令:bin ./ride.py启动RIDE,如下图所示。

微信图片_20220524162835.png

PS: 其它三方库演示项目中,暂不需要,读者可根据实际需求,自行安装。

3.  创建实战示例项目


1、 创建trainning演示项目,并在项目下,创建失败重试机制实战目录,并依次创建测试套件、测试用例,示例结构如下:

微信图片_20220524162800.png

2、 编写测试用例,测试用例逻辑如下:

*** Settings ***
Library           Collections
*** Test Cases ***
Class_01_随机取数,模拟随机出现失败场景
    @{list}=    create list    1    2    3
    ${random_num}=    Evaluate    random.choice(${list})    random
    log    ${random_num}
    should be true    ${random_num}==2
  • 在测试用例中,先通过create list关键字创建了一个名称为${list}的列表变量,并依次存入1、2、3三个元素。
  • 再通过Evaluate万能关键字,结合random.chocie方法,从列表中随机取出一个整型元素,保存到名称为{random_num}变量中。
  • 最后,通过should be true关键字,断言变量等于由于第二步的随机取值,会让{random_num}变量值具有随机性(可能等于2,也可能是1或3),从而实现模拟一条随机失败的用例场景。

运行成功结果:

微信图片_20220524162726.png

运行失败结果:

微信图片_20220524162653.png

4. 用例失败重试机制实现


Robot Framework 官方并没有提供类似retry等参数来配置失败用例重执行。仅仅提供了--rerunfailed参数对基于结果文件output.xml来选择重新执行失败的用例。

4.1 基于RF框架自身的重试机制

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

robot --output original.xml .

微信图片_20220524162617.png

2、 重新运行测试用例,并将第二次运行的结果文件输出保存到rerun.xml文件中。

robot --output rerun.xml --rerunfailed original.xml .

微信图片_20220524162543.png

3、合并两次运行的结果输出文件。

rebot --merge original.xml rerun.xml

微信图片_20220524162512.png

在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
    ${random_num}=    Evaluate    random.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    ${times}
        log    第${index+1}运行结果: ${status}
        Exit For loop if    '${status}'=='PASS' or '${status}'=='True'
        log    第${index+1}次重试运行
        ${status}=    Run keyword And Return Status    测试用例关键字
    END

用例重试机制关键字中,先通过${TEST STATUS}内置变量,获取用例执行结果,并且接收变量${times}用于控制重试次数,如果用例执行状态等于PASS则直接退出重试,否则调用Run keyword And Return Status关键字继续运行测试用例。

3、为了便于演示,增加一条名称为Class_02测试用例,内容如下:

Class_02_随机取数,模拟随机出现失败场景
    测试用例关键字
    [Teardown]    run keyword    用例重试机制    5

到此, 我们已经在用例逻辑层面实现了用例失败重试机制了。

PS: 用例重试机制逻辑,读者可根据自身需求进行改造,本文的用例重试机制并不是唯一的方法。

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)

微信图片_20220524162414.png

4、 打开robot/conf/setting.py文件,修改_cli_opts字典,增加'Retry': ('retry', 3),,如下所示:

微信图片_20220524162334.png

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查看一下配置参数项。

微信图片_20220524162253.png

7、 输入如下命令,结合Class_01用例,验证用例失败重试机制:

robot --test Class_01_随机取数,模拟随机出现失败场景 --retry 3 .

微信图片_20220524162221.png

如果测试用例运行结果为PASS,运行一次即正常结束,如果用例运行失败,则会重试3次执行。

5. 小结


本文以Robot Framework框架为例,介绍了在自动化测试过程中,如何实现用例脚本失败重试机制,并且分享了三类实现思路:

  • 借助依赖框架自身是否有用例失败重试运行机制。
  • 从用例脚本自身逻辑处入手,实现失败运行重试。(适用于被特殊处理过的用例逻辑)
  • 从扩展框架源码,自定义失败重试运行机制。(通常适合于所有失败用例)

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

原创不易,好的干货创作更不易,不知不觉,断断续续又花了周六一下午码这篇文章,希望对大家在实施自动化测试工作当中有所帮助或启发!

目录
相关文章
|
19天前
|
存储 关系型数据库 测试技术
玩转n8n测试自动化:核心节点详解与测试实战指南
n8n中节点是自动化测试的核心,涵盖触发器、数据操作、逻辑控制和工具节点。通过组合节点,测试工程师可构建高效、智能的测试流程,提升测试自动化能力。
|
14天前
|
Web App开发 前端开发 JavaScript
Playwright极速UI自动化实战指南
Playwright告别Selenium痛点,以智能等待、强大选择器、网络拦截与多设备模拟四大利器,提升自动化效率与稳定性。本文通过实战代码详解其加速秘籍,助你构建高效、可靠的UI测试方案。
|
2月前
|
Web App开发 人工智能 JavaScript
主流自动化测试框架的技术解析与实战指南
本内容深入解析主流测试框架Playwright、Selenium与Cypress的核心架构与适用场景,对比其在SPA测试、CI/CD、跨浏览器兼容性等方面的表现。同时探讨Playwright在AI增强测试、录制回放、企业部署等领域的实战优势,以及Selenium在老旧系统和IE兼容性中的坚守场景。结合六大典型场景,提供技术选型决策指南,并展望AI赋能下的未来测试体系。
|
2月前
|
存储 人工智能 算法
AI测试平台实战:深入解析自动化评分和多模型对比评测
在AI技术迅猛发展的今天,测试工程师面临着如何高效评估大模型性能的全新挑战。本文将深入探讨AI测试平台中自动化评分与多模型对比评测的关键技术与实践方法,为测试工程师提供可落地的解决方案。
|
2月前
|
人工智能 缓存 测试技术
Playwright进阶指南 (6) | 自动化测试实战
2025企业级测试解决方案全面解析:从单元测试到千级并发,构建高可用测试体系。结合Playwright智能工具,解决传统测试维护成本高、环境依赖强、执行效率低等痛点,提升测试成功率,内容从测试架构设计、电商系统实战框架、高级测试策略、Docker化部署、CI/CD集成及AI测试应用,助力测试工程师掌握前沿技术,打造高效稳定的测试流程。
Playwright进阶指南 (6) | 自动化测试实战
|
25天前
|
人工智能 数据可视化 测试技术
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
275 11
|
2月前
|
资源调度 前端开发 JavaScript
Jest 测试实战指南
本文系统讲解如何使用 Jest 进行高效的 JavaScript 函数测试,涵盖环境搭建、测试用例编写、模拟函数与快照测试等内容,帮助开发者提升代码质量与测试效率。
|
2月前
|
人工智能 缓存 监控
大模型性能测试实战指南:从原理到落地的全链路解析
本文系统解析大模型性能测试的核心方法,涵盖流式响应原理、五大关键指标(首Token延迟、吐字率等)及测试策略,提供基于Locust的压测实战方案,并深入性能瓶颈分析与优化技巧。针对多模态新挑战,探讨混合输入测试与资源优化
|
2月前
|
传感器 人工智能 JavaScript
Playwright实战:写UI自动化脚本,速度直接起飞
简介: 测试工程师老王因UI自动化问题深夜奋战,反映出传统测试工具的局限性。微软开源的Playwright凭借智能等待、跨域操作、移动端模拟与网络拦截等强大功能,正迅速取代Selenium,成为新一代自动化测试标准。其稳定高效的设计显著降低维护成本,助力企业构建高质量测试流程。
|
3月前
|
供应链 搜索推荐 安全
淘宝/京东/亚马逊API实战:中小商家的自动化生存指南
电商API是连接电商平台、商家、支付与物流系统的技术桥梁,具备商品管理、订单处理、用户服务、营销支持等功能,助力业务自动化与数据驱动决策,成为电商生态中提升效率与创新的关键基础设施。

热门文章

最新文章