如何应对UI测试自动化的不稳定循环!

以下为作者观点:

当我加入UI自动化团队时,我很高兴能为新功能的自动化测试用例开发做出贡献。然而,我很快意识到团队花费了大量时间来修复之前迭代中不稳定的测试。这种情况让我感到困惑,因为当自动化测试脚本已知不稳定时,将其推送到 main branch 似乎是违反直觉的。

与团队讨论后,我了解到,紧迫的时间压力常常导致合并不完整或不稳定的测试脚本。此外,还缺乏健全的流程来识别和处理不稳定的测试,以免它们进入 main branch。结果就是 "不可靠的测试越来越多,削弱了我们对自动化套件的信心",并拖慢了我们的开发进程。

为了应对这一挑战,我着手简化我们的测试流程并防止不稳定的测试污染我们的主要测试套件。以下是一些思考过程:

了解UI自动化生命周期

为了了解不稳定测试问题的根本原因,我必须了解并领悟团队内部所遵循的 UI 自动化生命周期的各个阶段。以下是该过程的细分:

图片

图1

  • 评估新的UI功能:团队彻底审查并了解每个新功能的功能、设计和用户交互。这涉及分析该功能如何与现有应用程序集成及其对用户体验的影响。

  • 确定可测试场景:确定新 UI 功能需要测试的关键用户场景和交互至关重要。正面和负面测试用例均需考虑,以确保全面覆盖。

  • 评估自动化可行性:评估新 UI 功能自动化测试的可行性是至关重要的一步。需要考虑的因素包括复杂性、可靠定位器的可用性、UI 稳定性以及整体测试自动化策略。

  • 制定测试计划:有必要制定详细的测试计划,概述新 UI 功能的测试方法、测试用例和预期结果。该计划包括手动和自动测试策略,以确保全面测试。

  • 设置测试自动化基础设施(如果有):确保必要的测试自动化基础设施到位至关重要。这包括选择合适的自动化工具、配置测试环境和设置测试数据管理流程。

  • 实施自动化场景:为新UI功能开发和实施自动化测试脚本。这涉及创建强大的定位器并遵循最佳实践,以实现可维护且可靠的测试自动化。

  • 集成自动化测试:将新的自动化测试集成到整体测试套件和持续集成/持续部署 (CI/CD) 流程中,确保测试作为常规构建和发布过程的一部分执行。

  • 持续监控和维护:定期检查和维护新 UI 功能的自动化测试,并根据需要更新测试以适应应用程序或测试环境的变化。监控测试结果并及时解决任何故障或问题。

在检查完整的 UI 测试自动化周期时,我注意到流程的右半部分和左半部分之间有明显的区别。

右半部分:顺利进展

周期((图1))的右半部分包括评估新的 UI 功能、确定可测试场景、评估自动化可行性、制定测试计划以及设置测试自动化基础设施,通常进展顺利。团队能够在每项新功能的指定时间范围内有效地完成这些步骤。

左半区:问题区域

然而,真正的挑战在于周期(图1)的左半部分。在这一部分,团队需要实施自动化场景,将其集成到整个测试套件中,并持续监控和维护自动化测试。

当团队为了满足紧迫的期限而匆忙实施和集成自动化测试而没有彻底验证其稳定性和可靠性时,就会出现问题。不稳定的测试被推到主分支,导致不可靠的测试积压越来越多,需要不断维护和修复。

团队没有专注于为即将推出的功能开发新的自动化测试或修改现有测试以适应功能更新,而是花费大量时间来处理不稳定的测试。这种恶性循环阻碍了团队及时高效地提供高质量自动化测试的能力。

图片

图2

为了进一步了解这个问题的根本原因,我需要更深入地研究不稳定测试的概念以及它们出现的原因。

不稳定测试是指自动化测试表现出不一致的行为,有时通过,有时失败,即使被测试的代码保持不变。这些测试给自动化套件带来了不确定性和不可靠性,使得测试结果难以令人信赖。

经过与团队的讨论和彻底的分析,我发现了不稳定测试发生的几个主要原因:

  • 时间问题:不稳定的测试通常由于与时间相关的问题而出现。依赖硬编码延迟的测试容易受到执行时间波动的影响,从而导致间歇性故障。如果处理不当,异步操作(例如API调用或UI交互)也可能会引入时间不确定性。

  • 环境不一致:测试环境的差异(例如不同的网络延迟、浏览器版本或操作系统)可能会导致测试不稳定。在一个环境中完美运行的测试可能会在另一个环境中意外失败(可能是管道),这使得重现和诊断问题变得困难。

  • 依赖外部因素:依赖外部服务、第三方 API 或特定数据条件的测试容易出现问题。如果这些外部因素不稳定或无法持续使用,即使应用程序代码正常运行,测试也可能会间歇性失败。

  • 测试隔离不足:缺乏适当的测试隔离会导致不稳定的测试。如果测试依赖共享资源或对执行顺序有依赖性,它们可能会相互干扰并产生不一致的结果。确保每个测试都是独立且自足的,对于缓解不稳定至关重要。

  • 非确定性行为:一些不稳定的测试可能是由应用程序本身的非确定性行为引起的。竞争条件、并发问题或代码中的随机性可能会导致测试以不可预测的方式通过或失败,这使得识别和解决潜在问题变得具有挑战性。

解决问题……

采取积极主动的方法:监控和解决不稳定因素

了解不稳定测试的根本原因是应对挑战的关键一步。有了这些知识,我与团队合作,设计出一种多方面的方法来正面解决不稳定问题。

在我们的团队中,我们会遵循两周的发布周期来发布任何更新或新功能(次要功能)。第一周专门用于 UI 自动化周期的右半部分,我们会彻底讨论 UI 设计和流程,让开发团队开始着手实现功能。在此期间,我们的团队专注于开发测试场景、审查它们,并最终确定哪些可以自动化。

第二周开始后,我们有五天的时间来开发测试脚本,并在周六晚上发布。理想情况下,如果我们到那时可以实现至少 80% 的自动化测试,那么发布过程就会变得更加顺畅,因为手动重新检查错误所需的时间会大大减少。

然而,我们遇到了一个重大障碍:在发布周期中,我们没有利用自动化测试脚本,而是发现自己陷入了困境,这迫使我们进行大量的手动测试。这提出了一个关键问题:

如果在最重要的时刻我们不能依赖自动化测试,为什么我们要花整整五天的时间来开发自动化测试呢?

经过仔细分析,我意识到虽然大多数测试都可以编写脚本,但缺少的关键要素是在两周的时间内持续监控开发的脚本。我们期望最终结果在周末之前就完美无缺,但实际上,除非开发的代码非常强大和可靠(这种情况很少见),否则这是不可能的。

为了解决这个问题,我有这个想法:

不仅要监控已开发的测试套件,还要在发布周期内密切关注新开发的测试。通过这样做,我们可以尽早发现并解决任何不稳定或可靠性问题,而不是等到周期结束。

图片

五个行动计划

此外,我们还制定了五个行动计划,以正面解决不稳定问题并确保整个发布周期内自动化测试的可靠性。该计划侧重于持续监控、协作和主动解决问题。让我们深入了解每个要点的细节:

  • 每日测试运行:如上所述,我们为新开发的自动化测试设置了每日测试运行,以便我们能够及时发现任何不稳定或故障。这给了我们充足的时间来调查和解决问题,以免问题在周期后期积累并造成延迟。

  • 协作代码审查:我们为自动化测试脚本制定了协作代码审查的实践。团队成员将审查彼此的代码,提供反馈和改进建议。这有助于保持代码质量,识别潜在的缺陷,并确保遵守最佳实践。

  • 不稳定测试跟踪和优先级排序:我们创建了一个专门的不稳定测试跟踪系统,根据不稳定测试的影响和发生频率记录和排序不稳定测试。这使我们能够将精力集中在最关键的不稳定测试上,并逐步解决积压问题。

  • 根本原因分析:每当发现不稳定的测试时,我们都会进行彻底的根本原因分析,以了解其不一致行为的根本原因。通过查明具体原因(例如时间问题、环境因素或测试隔离问题),我们可以制定有针对性的解决方案来消除不稳定性。

  • 持续改进:我们在团队内部培育了持续改进的文化。我们定期举行回顾和知识共享会议,讨论所取得的进展、分享见解并确定测试自动化流程中需要进一步改进的领域。

通过实施这些措施并在整个发布周期内监控已开发的测试,我们见证了自动化测试套件的不稳定性显著减少和可靠性提高。团队对自动化测试的信心增强,我们可以在发布过程中有效地利用它们,从而节省宝贵的时间和精力。

然而,值得注意的是,对抗不稳定测试的斗争是一场持续不断的战斗。随着应用程序的发展和新功能的引入,不稳定的风险仍然存在。保持积极主动的方法、持续监控测试结果并迅速解决任何不稳定行为对于保持自动化套件的可靠性和可信度至关重要。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

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

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

相关文章

git使用中 error: pathspec ‘XXX‘ did not match any file(s) known to git 报错解决方法

报错原因 本人在本地开发中,切换线上新创建分支时: $ git checkout master01 error: pathspec master01 did not match any file(s) known to git解决方式 $ git branch -a | grep master * masterremotes/origin/HEAD -> origin/masterremotes/or…

python开发api接口框架

在现代软件开发领域中,API接口框架扮演着非常重要的角色。它可以帮助开发者快速搭建和部署API,提供数据交换的接口,使得不同系统之间可以进行通信和数据传输。Python作为一门功能强大且易于学习的编程语言,被广泛应用于API接口的开…

【Windows 常用工具系列 17 -- windows bat 脚本多参数处理】

请阅读【嵌入式开发学习必备专栏】 文章目录 bat 脚本命令行参数使用示例多参数处理使用示例遍历所有参数 bat 脚本命令行参数 在Windows批处理(.bat)脚本中接收命令行参数是一个常见的需求,这样的脚本能够根据提供的参数执行不同的操作。命…

Kubernetes之Controller详解

本文尝试从Kubernetes Controller的种类、交互逻辑、最佳实践、伪代码示例及历史演进5个方面对其进行详细阐述,希望对您有所帮助! 一、Kubernetes Controller种类 Kubernetes Controller Manager 是 Kubernetes 集群的核心组件之一,负责管理…

身边的故事(十一 ):阿文的故事:红包

虽然是发小,但是小时候的记忆很模糊了,从哪里写起呢?时间节点从大学开始吧,初中的那些有机会后续再写了。 今年回家过年的时候收到阿番要结婚的消息。大年初三阿番就在微信上给我发电子请帖。阿番的女朋友和阿番同居已经有三四年。…

C++ std::array的原理和语法

原理 std::array 是C标准库提供的一个模板类,用于表示固定大小的数组。与传统的C风格数组不同,std::array 提供了更加安全和功能丰富的接口,并且它的大小在编译时就已经确定。std::array 实际上是对传统数组的一个轻量级封装,提供…

无线幅频仪制作(WiFi通信)-含STM32源程序,JAVA上位机与设计报告

资料下载地址:无线幅频仪制作(WiFi通信)-含STM32源程序,JAVA上位机与设计报告 目录 项目功能 1、 系统方案1.1 比较与选择 1.1.1 控制器的论证与选择 1.1.2 信号源的论证与选择 1.1.3 放大器模块的论证与选择 1.1.4 键盘与显示模块的论证与选择 1.1.5 网络通…

[保姆级教程]uniapp小程序获取右上角胶囊位置信息

文章目录 导文使用uni.getMenuButtonBoundingClientRect();方法实现完整案例 隐藏默认导航栏&#xff1a;全局隐藏当前页面隐藏 导文 uniapp小程序获取右上角胶囊位置信息 使用uni.getMenuButtonBoundingClientRect();方法实现 <script>const menuButtonInfo uni.getMe…

logstash配置文件中明文密码加密

1 案例背景 应用配置文件中禁止使用明文密码&#xff0c;需要加密处理 上图中&#xff0c;红框打码位置为es的明文密码&#xff0c;需要对其进行处理 2 创健keystore文件 /rpa/logstash/bin/logstash-keystore --path.settings /rpa/isa/conf/logstash/ create 注&#xff1…

记录正则提取文章

收到了个word版的电子书&#xff0c;需要拆分并转换为md存储到数据库中&#xff0c;便于搜索&#xff0c;记录下用正则提取文章的过程 word原文中有目录&#xff0c;可提取出目录后&#xff0c;在正文中根据目录来正则提取文章 正则的多行匹配 在匹配大量文章的时候&#xff…

互联网时代的语义网知识表示框架---OWL和OWL2 Fragments

文章目录 RDF和RDFSOWL的重要词汇RDF和RDFS 前面介绍了RDF和RDFS,通过RDF (S)可以表示一些简单的语义,但在更复杂的场景下, RDF (S)语义的表达能力显得太弱,还缺少常用的特征: 对于局部值域的属性定义。RDF (S)中通过rdfs:range定义了属性的值域,该值域是全局性的…

llm-universe | 四. 构建RAG应用

构建RAG应用 一.将LLM 接入 LangChain二.构建检索问答链1.加载向量数据库2.创建一个 LLM3.构建检索问答链4.检索问答链效果测试5.添加历史对话的记忆功能5.1 记忆&#xff08;Memory&#xff09;5.2 对话检索链&#xff08;ConversationalRetrievalChain&#xff09; 三. 部署知…

ts可选参数

可选参数 参数后加个问号&#xff0c;代表这个参数是可选的 function bdd(x:number,y?:number){return x y } console.log(bdd(2,3)) function bdd(x:number,y?:number){return x y } console.log(bdd(2))

从0到1构建自己的短链接系统

1. 短链系统简介 1.1 短链系统的定义与用途 短链系统是指将一个较长的URL地址&#xff0c;通过特定的算法生成一个较短的、具备唯一性的URL地址。这种系统广泛应用于社交网络、短信、邮件营销等场景&#xff0c;它能帮助用户在字数受限的情况下分享链接&#xff0c;并且还具有…

Jenkins 创建流水线任务

Jenkins是一个流行的持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;工具。 Jenkins 创建任务 选择“流水线”类型&#xff0c;该类型的优点是定制化程度非常高 &#xff08;可选&#xff09;添加“参数化构建” 配置仓库选项(ssh连接、分支)和凭据…

C语言从头学26——函数说明符

一、extern 说明符 我们在阅读C、C底层代码或是MFC代码时&#xff0c;会看经常到 extern 这个符号。对于多文件的项目&#xff0c;源码文件经常会用到其他文件声明的函数。这时&#xff0c;当前文件里面&#xff0c;需要给出外部函数的原型&#xff0c;并用 extern 说明…

上古世纪台服注册账号+下载客户端全方位图文教程

又一款新的MMRPG游戏即将上线啦&#xff0c;游戏名称叫做《上古世纪》游戏采用传统MMO类型游戏的玩法&#xff0c;但是开发商采用了先进的游戏引擎&#xff0c;让玩家们可以享受到极致的视觉体验。同时游戏的背景是建立在大陆分崩离析的基础上。各个部落因为领地的原因纷纷开战…

华为HCIP Datacom H12-821 卷11

1.多选题 OSPF 包括哪些报文类型? A、Link State DD B、Hello C、Link State Request D、Database Description 正确答案: B,C,D 解析: 在 OSPF协议中,报文类型分为:hello、DD、LSR、LSU、LSAck 。所以正确答案是“Hello”、“Database Description”、“Link State Re…

Linux中Vim的安装与配置:从入门到精通

Vim&#xff0c;一个功能强大的文本编辑器&#xff0c;已经成为许多开发者和系统管理员的首选工具。它不仅拥有丰富的功能&#xff0c;而且高度可定制&#xff0c;支持多种编程语言的语法高亮&#xff0c;使得编辑代码变得更加轻松。本文将详细介绍如何在Linux系统中安装Vim&am…