端到端测试(End-to-end tests)重试策略

news2024/11/19 3:46:32

作者|Giuseppe Donati,Trivago公司Web测试自动化工程师

整理|TesterHome


失败后重试,是好是坏?

为什么要在失败时重试所有测试?为什么不?

作为Trivago(德国酒店搜索服务平台)酒店搜索前端QA团队,过去几年我们试图避免针对失败的暴力重试策略,我们宁愿只在选定的情况下执行测试重试。

最近,当我们为新的前端 Web 应用程序转而采用持续部署方法时(该方法允许开发人员自主合并和发布某些拉取请求),我们比以前更需要可理解且稳定的测试结果。

因此,为了确保对测试结果有足够的信心,并避免拖慢软件开发生命周期,对拉取请求的自动检查显示尽可能少的 "危险信号 "变得更加重要。至少在某些情况下,要求和确定性结果与成功率之间的平衡发生了变化。

我们不同的重试策略

由于我们的新 Web App 存储库位于 GitHub 上,并且我们在 GitHub Actions 中为其运行端到端自动化测试,因此我们通过针对不同的测试套件或工作流程采用不同的重试策略来满足新的要求。他们是:

  • 无论出于何种原因,在失败时重试任何内容 -> 在每次提交时运行的“核心”测试上实现。在任何情况下重试的原因是为了增加对拉取请求的信心,而不会对反馈周期造成太大影响。测试很少,并且可以快速且低成本地再次执行。

  • 根据特定的失败原因对失败进行过滤重试 -> 在“扩展”测试上实现,利用我们的测试自动化框架的重新运行检测器插件部分。这是一个插件,用于将测试失败与自定义异常列表(例如环境问题)进行比较,以便触发它们进入第二个重新运行阶段。一个示例可能是在搜索酒店时遇到空结果列表,假设这可能是由后端中断引起的。我们认为,某些完全或主要属于外部因素的失败原因应该是在运行所有其他测试时在最后重试相同测试的有效理由。异常子字符串的示例可以是:Session timed out or not foundEmpty page detectedError communicating with the remote browser

  • 手动重试场景子集 -> 添加到我们箭袋中的最新箭头。这也是属于“扩展”测试执行的一个功能,它简化了实际故障的识别,同时使我们的 QA 工程师能够更好地控制测试执行时间和资源使用。我们将在接下来的段落中深入探讨细节。

查看GitHub Actions中的trupi扩展工作流程

现在介绍一些关于如何执行测试的背景知识。

我们的 Web 平台的自动化测试由内部开发的名为 trupi 的框架执行。Trupi 基于 Selenium 和 Cucumber,并用 Java 编写。

我们的测试方案是用 Cucumber 编写的故事。我们有一些 "核心 "测试,每当一个新的拉取请求被打开,以及每一个后续的推送事件发生时,这些测试就会直接在 CI 工作流中运行,它们由一个自定义的 Cucumber 标签"@core "(https://cucumber.io/docs/cucumber/api/?lang=java#tags)来标识。除了测试最频繁的用户流并确保核心功能正常运行的核心测试外,我们还有 "扩展 "套件,它们规模更大,因此运行速度更慢。它们的执行是通过聊天机器人式的方法手动触发的。是否以及何时运行此类测试由质量保证工程师或开发人员决定,但通常至少要运行一次--在代码审查完成后,也可能在广泛的探索性测试之前。


在拉取请求中留下以 /trupi-extended 开头的注释将触发这些扩展测试的执行。

图片

目前,在 trupi-extended 工作流程中有三个不同的工作,使用矩阵策略,分别在 Chrome 桌面、Chrome 移动(移动模拟模式)和未启用 JavaScript 的 Chrome 浏览器中运行测试。每个工作都能处理同一文件夹中的不同测试套件,并根据标签表达式选择单个测试。

图片

然后,扩展测试运行的结果会以新注释的形式添加到同一拉取请求中,其中包含失败或成功的信息以及相关测试报告的链接。

为了获得更好的反馈,注释实际上是逐步添加和修改的:执行开始时会添加第一条注释,然后在成功或失败时将其替换,并用表情符号对原始触发注释做出反应。该命令有可选参数,可以只执行子集,例如只执行 "桌面",或在执行测试时应用某些变化。最新添加的 "失败 "参数可以手动重新运行上次运行失败的作业,只挑选失败的测试执行。

测试执行时间和不稳定问题

尽管我们在测试设置的多个方面和每个测试场景中不断应用优化策略,但所有端到端测试套件都会受到一些不稳定性的困扰。

也就是说,即使代码没有改变,测试也可能在不同的运行中通过或失败。对于 Selenium 测试来说,98% 或 99% 的成功率在纸面上可以说是不错了,但它显然没有真正的稳定性好。在大量测试(如300或400次)中,哪怕只有 或2次测试失败,也会让人产生某种怀疑,这还不如全面成功和green check。

出现少量失败时怎么办?个人的决定可能是重新运行整个测试套件。再次运行由数百个测试组成的扩展测试套件大约需要10分钟,这会推迟发布时间,消耗更多资源,从而导致额外成本。此外,这也不能保证其他测试不会遇到环境问题或其他随机失败原因。面对这一挑战,我们寻找一种解决方案,使开发人员和质量保证工程师能够在这种情况下获得更快、更准确的反馈周期。

如何半自动重新运行失败的测试


我曾做过一次题为 "测试半自动化 "的演讲,重点介绍了我为支持自己和团队进行探索性测试而编写的 Chrome 浏览器扩展。

谈到 "自动化 "这个话题,只要人工智能没有完全接管整个测试和反馈周期(如果它能做到的话),我仍然认为测试中最重要的部分是人

自动化工具只是一种工具,可以帮助我们更快更好地完成测试工作。当我们考虑如何利用自动化改善体验时,特别是在长期运行的 trupi-extended 工作流程中,我们选择了退一步,实行半自动化。这里的半自动化是指在流程中需要更多必需的人工操作,同时保持简单快捷的体验。

我们要解决的第一个问题是:由于我们使用开源的 Cucable 插件(由我们的测试自动化工程师 Benjamin Bischoff 开发)来并行化测试执行,因此生成的 "切片 "运行程序不再基于原始特征文件,我们也无法列出原始 Cucumber 场景在特征文件中的位置。Benjamin 挽救了这一问题,他发布的 Cucable 1.10.0 新版本正是提供了这一功能,因为它创建了一个generated-features.properties 文件,其中存储了所有生成的特性名称及其对相应源特性的引用。文件内容如下:

Calendar_scenario001_run001_IT=src/test/resources/features/search-form/Calendar.feature:124
    GuestSelector_scenario003_run001_IT=src/test/resources/features/search-form/GuestSelector.feature:31

接下来的问题是如何处理测试工作运行结束时的失败列表。由于 GitHub Actions 工作流运行结束时不会持久化自定义数据,而且考虑到工作流总是从主分支运行,因此顺序是非线性的(所有拉取请求的 trupi-extended 运行都由相同的主分支标识),我们考虑了几种方案:

  • 将生成的 txt 文件作为工作流运行工件,并通过下载操作从 "重试失败 "运行中获取。

  • 将生成的 txt 文件推送到Google Cloud Storage (GCS) 存储桶,然后从那里下载。

上述两个选项实际上都需要一些步骤来识别上一次运行的 ID 或 GCS 的唯一标识符,然后才能下载列表。总的来说,还需要几个额外的步骤。因此,我们考虑了第三种可能更简单的方案:

  • 如果发生故障,工作流程中的每个测试任务都将解析 failed_scenarios.txt 内容。然后,它会删除由于场景大纲示例失败而产生的任何重复内容,因为它们是不同的测试,但在 Cucumber 特征文件中的位置相同。最后,它会在结果注释中添加一个用<!-- -->包装的隐藏注释部分。

图片

图片

这种方法有几个优点:

  • 数据保留在需要的地方:在拉取请求中。

  • 只需查看包含特定文本(如 "tests executed with result:FAILED "这样的特定文本。

  • 如果需要,甚至可以手动检查或编辑。

然后,我们添加了实际的失败重试。通过在命令中使用 "failures "参数,即 /trupi-extended failures,工作流将不会创建通常默认的由三个任务组成的矩阵,而是会读取最后一条现有注释中包含失败信息的隐藏部分。它将查找识别故障列表的特定关键字(如 "mobile_failed="等),以分隔符"; "分隔,收集每个关键字的列表,并在此基础上创建一个大小可变的矩阵(1到3个作业),为每个作业提供要执行的相应方案列表。

图片

这样,结果注释也会反映出只执行了先前失败的测试,而且还会指向先前的运行ID以供参考。此外,还可以注释/trupi-extended 失败,并再次递归运行,但希望此时任何异常测试都已通过。如果在第二次尝试时出现同样的异常,那么真正的失败就显而易见了。

图片

结论

端到端测试的重试策略因测试套件的要求和执行环境而异。我们最新增加的故障手动重试解决方案帮助我们在 "在任何情况下重试一切 "的方法和整个测试套件的完全手动重新运行之间找到了有价值的折中方案。

现在,我们的质量保证工程师可以自己评估情况,大多数情况下,只需再写一条注释并多等几分钟,就能使最大的一组自动化测试完全成功。

我们解决了所有问题吗?当然没有,因为缺陷和环境问题会继续存在,有时还会给我们带来麻烦,尽管我们每天都在解决这些问题。除了持续观察测试结果并对其进行维护外,我们还采用了不同的重试方法,这增强了我们在合并之前的信心,然后通过我们的CD流程直接发布到生产中,呈现给我们的数百万用户。


了解更多国内的质量保证方面的落地实践,可以来看看这场测试开发圈年度技术交流大会!

将于11月25日举办的MTSC2023第十二届中国互联网测试开发大会(深圳站),特别设置有质量保障专场(详见下图),来自头部科技、互联网公司的技术专家,将就质量保障体系建设、风险防控、能力建设等相关话题展开分享。

欢迎来MTSC2023深圳大会一起讨论,目前大会门票,7折优惠已经结束,限时8折优惠进行中,先到先得!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1105832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cesium Vue(四)— 物体(Entity)的添加与配置

1. 添加标签和广告牌 // 添加文字标签和广告牌var label viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(113.3191, 23.109, 750),label: {text: "广州塔",font: "24px sans-serif",fillColor: Cesium.Color.WHITE,outlineColor: Cesium.…

什么是美颜SDK?解析主播直播美颜SDK的技术原理与应用

当下&#xff0c;越来越多的主播和内容创作者依赖直播平台来与观众互动、分享内容和实时传达信息。然而&#xff0c;为了在激烈的竞争中脱颖而出&#xff0c;许多主播需要借助美颜技术来提高他们的外貌吸引力。这就引入了主播直播美颜SDK&#xff0c;一个结合了技术原理与应用的…

链表 oj2 (7.31)

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 我们通过头插来实现 将链表上的节点取下来&#xff08;取的时候需要记录下一个节点&#xff09;&#xff0c;形成新的链表&#xff0c;对新的链表进行头插。 /*** Definition for singly-linked list.* struct ListNode…

2024年湖北建筑安全员abc三类人员考试新题库考试题库

2024年湖北建筑安全员abc三类人员考试新题库考试题库 湖北三类人员建筑安全员ABC证新题库是存在的&#xff0c;因为安管系统老更新&#xff0c;每次更新后&#xff0c;新题库&#xff08;重点题库&#xff09;就会有所变化。新题库主要是针对考试的&#xff0c;提高考试合格率…

基于selenium的pyse自动化测试框架

介绍&#xff1a; pyse基于selenium&#xff08;webdriver&#xff09;进行了简单的二次封装&#xff0c;比selenium所提供的方法操作更简洁。 特点&#xff1a; 默认使用CSS定位&#xff0c;同时支持多种定位方法&#xff08;id\name\class\link_text\xpath\css&#xff09;…

新工控机的基本配置过程

我们50水球上的工控机使用的是&#xff1a;英特尔 NUC10i7FNH 迷你电脑&#xff08;通过查看铭牌获知&#xff09;。对应官网&#xff1a; https://www.intel.cn/content/www/cn/zh/support/products/188811/intel-nuc/intel-nuc-kits/intel-nuc-kit-with-10th-generation-inte…

【temu】分析拼多多跨境电商Temu数据分析数据采集

Temu是拼多多旗下跨境电商平台&#xff0c;于2022年9月1日在美国、加拿大、新加坡、中国台湾、中国香港等市场上线。本文作者从销售额、销量、产品分布等方面&#xff0c;对Temu产品进行了分析&#xff0c;一起来看一下吧。 item_get获得商品详情item_review获得商品评论列表it…

线上购药小程序的崭新时代:医疗与科技的完美结合

在当今数字化时代&#xff0c;医疗和科技的融合已经催生了许多创新的解决方案&#xff0c;其中线上购药小程序正是医疗与科技完美结合的杰出代表。在这篇文章中&#xff0c;我们将一起探讨如何使用现代技术来创建一个简单的线上购药小程序原型&#xff0c;以展示医疗和科技的崭…

Mysql 约束,基本查询,复合查询与函数

文章目录 约束空属性约束默认值约束zerofill主键约束自增长约束唯一键约束外键约束 查询select的执行顺序单表查询排序 updatedelete整张表的拷贝复合语句group by分组查询 函数日期函数字符串函数数学函数其他函数 复合查询合并查询union 约束 空属性约束 两个值&#xff1a…

springcloud之项目实战服务治理

写在前面 在这篇文章 我们已经搭建完成了优惠券模块的单体版本&#xff0c;为了向微服务化迈出坚实的一步&#xff0c;这部分来看下服务治理的内容&#xff0c;并在我们的项目中引入服务治理&#xff0c;下面我们就开始吧&#xff01; 源码 。 1&#xff1a;什么是&#xff…

基于Java公益志愿捐赠管理系统设计与实现(源码+LW+调试+开题报告)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

卡尔曼滤波器融合六轴IMU数据

卡尔曼滤波 卡尔曼滤波是一种常用的状态估计方法&#xff0c;其基本原理是对系统状态进行最优估计。其主要思想是将系统的状态分为先验状态和后验状态&#xff0c;通过将先验状态和观测值进行加权平均&#xff0c;得到最优估计状态。 卡尔曼滤波增益的计算是使后验误差协方差…

程序员工作5年,还是个中级程序员,如何再快速晋升?

我曾经就是这个状态&#xff0c;5年工作经验就像是一年工作经验用了5年。职业生涯遇到了瓶颈&#xff0c;无法突破。分析原因有很多&#xff0c;一方面是基本功没练好&#xff0c;像操作系统底层、数据结构、算法、计算机网络这些计算机基础知识掌握的不扎实&#xff0c;不能灵…

vue项目的创建——总结版

目录 前提&#xff1a; 一、vue项目的创建 二、浏览项目页面 三、vue项目目录文件含义和作用 ​四、修改端口号 前提&#xff1a; 首先要有Node.js环境。 1.安装vue npm install vue 2.命令行工具&#xff08;CLI&#xff09;为单页面应用快速搭建繁杂的脚手架 npm in…

vulnhub之MATRIX-BREAKOUT 2 MORPHEUS

信息收集 输入命令&#xff1a;arp-scan 192.168.239.0/24&#xff0c;探测存活主机&#xff0c;发现192.168.239.185 对存活主机进行端口扫描&#xff0c;发现&#xff1a;22、80、81端口 浏览器访问http://192.168.239.185:81是一个登录界面 浏览器访问http://192.168.239.…

大模型携手AI原生应用融入产业场景

前言 10月17日&#xff0c;百度世界2023在北京首钢园召开。百度集团执行副总裁、百度智能云事业群总裁沈抖宣布&#xff0c;对“云智一体”的战略内涵全面升级&#xff0c;即云智一体&#xff0c;深入产业&#xff0c;生态繁荣&#xff0c;AI普惠。重磅发布“千帆AI原生应用开…

ASO优化之增加APP应用下载安装量的技巧1

想要增加APP应用的下载安装量&#xff0c;首先要在发布之前&#xff0c;分析我们的应用推广策略该如何运作并进行调整。提高知名度的基础是关键词&#xff0c;其次使用社交网络来推广我们的应用程序。 1、基础与规划。 在启动应用程序或者是实行ASO计划之前&#xff0c;需要了…

6-3 用链栈实现将非负的十进制数转换为指定的进制数【有题解视频,可本地编译器调试】 分数 15

int DecimalConvert(LinkStack s, int dec, int scale) {while (dec){if (LinkStackPush(s, dec % scale))dec dec / scale;elsereturn 0;}return 1; }

微信小程序获取手机号和openid

小程序通过wx.login组件会返回一个code&#xff0c;这个code用来获得用户的openid。 小程序写法为&#xff1a; wx.login({success (res) {if (res.code) {//发起网络请求wx.request({url: https://example.com/onLogin,// 后台给的请求地址data: {code: res.code}})} else {…

流程图如何制作?好用的11款流程图软件盘点!

流程图是一种强大的可视化工具&#xff0c;用于清晰地展示各种过程和步骤&#xff0c;应用非常广泛&#xff0c;在各个行业中随处可见&#xff0c;凡是涉及流程步骤的场景&#xff0c;都可以用到流程图&#xff0c;那么问题来了&#xff1a;流程图如何制作&#xff1f; 这篇文…