news 2026/4/15 12:04:51

Jenkins+RobotFramework 失败用例重执行方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Jenkins+RobotFramework 失败用例重执行方案

接口测试用例运行在Jenkins节点上,在某些情况下,比如网络波动等原因,会导致用例运行失败,此时会触发邮件和钉钉预警,通知给到责任人,按照现有策略,当本次构建失败时,会立马触发第二次构建活动,若第二次构建仍然失败,则会再次触发预警信息。在这种策略下,会导致相关责任人收到一些额外的无意义预警信息(如第一次构建超时,而第二次构建成功),所以就多写了一个脚本,在Jenkins中作为Robotframework用例的运行入口,当有用例执行失败时,在所有cases执行完成后,会选择本次运行失败的cases再重试一次,然后合并两次的测试报告文件。

脚本内容很简单,可拓展性很强:

  1. #!/usr/bin/env python

  2. # -*- coding:utf8 -*-

  3. import getopt

  4. import os

  5. import sys

  6. from pathlib import Path

  7. from robot.api import ExecutionResult

  8. def parse_args() -> tuple:

  9. """解析命令行传入的参数"""

  10. opts, args = getopt.getopt(sys.argv[1:], '-i:-e:-F:-E:', ["includeTag=", "excludeTag=", "format=", "env="])

  11. try:

  12. target = args[0]

  13. except IndexError:

  14. target = "./"

  15. def _parse(option, default_value=None):

  16. if isinstance(option, tuple):

  17. temp = [opt_value for (opt_name, opt_value) in opts if opt_name in option]

  18. else:

  19. temp = [opt_value for (opt_name, opt_value) in opts if opt_name == option]

  20. return temp[0] if len(temp) > 0 else default_value

  21. include_tag = _parse(("-i", "--includeTag")) # 包含用例标签

  22. exclude_tag = _parse(("-e", "--excludeTag")) # 排除用例标签

  23. env = _parse(("-E", "--env"), 'm') # 用例运行环境

  24. fm = _parse(("-F", "--format"), 'robot') # 用例文件后缀名

  25. return include_tag, exclude_tag, env, fm, targetdef first_run(target, env, include_tag, exclude_tag, fm): """首次运行用例

  26. 项目的基本目录结构是固定的, 在命令行中写死了变量文件的相对路径.

  27. """

  28. if include_tag:

  29. cmd = f"robot -F {fm} -i {include_tag} --output output_origin.xml --log NONE --report NONE -V variables.py:{env} -V ../Common/Variables/commonVars.py:{env} {target}"

  30. elif exclude_tag is not None:

  31. cmd = f"robot -F {fm} -e {exclude_tag} --output output_origin.xml --log NONE --report NONE -V variables.py:{env} -V ../Common/Variables/commonVars.py:{env} {target}"

  32. else:

  33. cmd = f"robot -F {fm} --output output_origin.xml --log NONE --report NONE -V variables.py:{env} -V ../Common/Variables/commonVars.py:{env} {target}"

  34. print(f'First run cmd >>>> {cmd}')

  35. os.system(cmd)def parse_robot_result(xml_path) -> bool:

  36. """解析用例运行结果"""

  37. suite = ExecutionResult(xml_path).suite

  38. fail = {}

  39. for test in suite.tests:

  40. if test.status == "FAIL":

  41. fail.update({test.name: test.status})

  42. all_tests = suite.statistics.critical print("*" * 50)

  43. print("当前运行目录为: ", os.getcwd())

  44. print("总测试条数:{0}, 初次运行时,通过的用例数: {1}, 失败的用例数: {2}".format(all_tests.total, all_tests.passed, all_tests.failed))

  45. if all_tests.failed > 0:

  46. print("其中失败的用例信息为: %s" % str(fail))

  47. print("*" * 50)

  48. return all_tests.failed > 0def rerun_fail_case(target, env, include_tag, exclude_tag, fm): """ # TODO

  49. 如果要重新运行整个套件,需要使用`rerunfailedsuites`, 如果只想重新运行失败的测试用例而不是套件中已通过的测试,则使用`rerunfailed`(必须保证case是独立的)

  50. -R, --rerunfailed <file>

  51. Selects failed tests from an earlier output file to be re-executed.

  52. -S, --rerunfailedsuites <file>

  53. Selects failed test suites from an earlier output file to be re-executed.

  54. """ if include_tag:

  55. cmd = f"robot -F {fm} -i {include_tag} -V variables.py:{env} -V ../Common/Variables/commonVars.py:{env} --rerunfailed output_origin.xml --output output_rerun.xml {target}"

  56. elif exclude_tag is not None:

  57. cmd = f"robot -F {fm} -e {exclude_tag} -V variables.py:{env} -V ../Common/Variables/commonVars.py:{env} --rerunfailed output_origin.xml --output output_rerun.xml {target}"

  58. else:

  59. cmd = f"robot -F {fm} -V variables.py:{env} -V ../Common/Variables/commonVars.py:{env} --rerunfailed output_origin.xml --output output_rerun.xml {target}"

  60. print(f'重复运行失败的用例: {cmd}')

  61. os.system(cmd)

  62. """再次运行失败的用例"""def merge_output():

  63. """合并xml文件,并生成测试报告

  64. 注意集成到jenkins中时,需要指定 Output xml name为merge.xml

  65. """

  66. os.system("rebot --merge --output merge.xml *.xml")def main():

  67. include_tag, exclude_tag, env, fm, target = parse_args() # 切换到output目录

  68. if Path(target).is_dir():

  69. os.chdir(Path(target))

  70. else:

  71. os.chdir(Path(target).parent)

  72. for xml in Path.cwd().glob("*.xml"):

  73. os.remove(xml)

  74. first_run(target, env, include_tag, exclude_tag, fm)

  75. failed = parse_robot_result("output_origin.xml")

  76. if failed:

  77. rerun_fail_case(target, env, include_tag, exclude_tag, fm)

  78. # 不论是否存在失败的用例, 都会合并测试报告

  79. merge_output()if __name__ == '__main__':

  80. main()

除-E参数外,其他都是robot提供的的命令行参数,在项目中使用了变量文件,来使得用例支持切换运行环境,-E参数需要传入用例运行的环境,-i 或-e参数用来传入标签,过滤本次要运行的测试用例,可以传入多个标签,如:H5ANDP1、H5ORMini、NotPaid等。

在Jenkins项目配置中,构建操作配置的 Execute Windows Batch Cmd 如下:

  1. cd %WORKSPACE%/ParkTest/interface

  2. python runrobot.py --env=%Env% -F robot -i %Tag% ./

  3. exit 0

Env和Tag都是在参数化构建时传入的,并且设有默认值。

在构建后操作中,使用Robot Framework插件收集构建结果,由于上面在脚本中修改了默认的输出文件名,这里要对应进行配置,如下

当项目第一次构建失败时,第二次构建只会运行之前失败的测试用例,并合并两次生成的测试报告,在测试报告中展示如下:

log.html

我配置的邮件通知模板

这样就可以减少一些无效的报错邮件了。

关于以上方案,有一点还要进行特别说明,那就是项目中测试用例之前必须是相互独立的。保持Case独立性我认为是很有必要的,每一个 Test Case 应该只测试一种场景,根据case复杂程度,不同场景同样可大可小,但不能相互影响。当我们有随机的跑其中某个Case或乱序的跑这些Cases时,测试的结果都应该是准确的。Suite level和Directory level同样要注意独立性的问题。保持Case的独立性,这一点应当作为自动化用例编写规范,严格要求组内其他成员。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 7:18:45

大模型面试必看!从RoPE到GraphRAG,十大高频面试题全解析(建议收藏)

本文整理了大模型技术面试的一、二面高频问题&#xff0c;涵盖RoPE相对位置编码原理、LoRA初始化方法、RAG与GraphRAG流程及优势对比、幻觉处理等关键技术点&#xff0c;并附有编程题示例&#xff0c;为大模型求职者提供全面的技术准备指南。一面 1.RoPE 为什么能实现相对位置编…

作者头像 李华
网站建设 2026/4/15 7:17:43

如何通过 RPA 构建企业微信外部群的自动化 SOP 流程?

一、 什么是外部群 SOP 自动化&#xff1f; 在私域运营中&#xff0c;SOP&#xff08;标准作业程序&#xff09; 是确保服务质量的关键。然而&#xff0c;官方接口在外部群&#xff08;尤其是包含非组织内成员的群聊&#xff09;的主动管理上&#xff0c;往往需要大量的人工配合…

作者头像 李华
网站建设 2026/4/5 13:48:00

基于python和vue的校园二手书交易系统_w387km94

目录 校园二手书交易系统摘要 开发技术 核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 校园二手书交易系统摘要…

作者头像 李华
网站建设 2026/4/3 14:20:28

Sambert-HifiGan在智能零售中的语音导购应用

Sambert-HifiGan在智能零售中的语音导购应用 引言&#xff1a;让AI声音更懂用户情绪的购物引导 在智能零售场景中&#xff0c;传统的自动化语音播报往往缺乏情感温度&#xff0c;机械单调的声音难以吸引顾客注意力&#xff0c;甚至可能引发听觉疲劳。随着消费者对个性化服务体验…

作者头像 李华
网站建设 2026/4/13 14:04:13

模型对比实验:LLaMA Factory多框架性能基准测试

模型对比实验&#xff1a;LLaMA Factory多框架性能基准测试指南 为什么需要做多框架性能基准测试 在大模型微调领域&#xff0c;技术选型团队经常面临一个关键问题&#xff1a;如何选择最适合项目需求的微调框架&#xff1f;LLaMA Factory作为当前流行的开源低代码大模型微调框…

作者头像 李华