cover_image

E2E 自动化探索实践

陈翔 高途技术
2023年12月27日 01:00
图片


图片

引言

背景

       项目在敏捷开发环境中,通常需要每周交付1-2次迭代,这种快速的交付节奏使得新功能的引入可能对现有的老功能模块造成影响。然而,对现有的老功能模块的影响往往在技术设计和开发阶段难以预测。为了应对这一挑战,团队需要在不增加项目交付时间成本的情况下,有效地增加测试覆盖率,以确保应用的质量。

       为了在这样的背景下应对问题,我们采取了一种策略。人工的方式创建了一个最小的测试集,这个测试集可以覆盖到因为新功能引入而可能受到影响的部分。虽然这些测试需要一定的人力投入,但相较于大规模的回归测试或者增加项目交付时间,这种方法在成本和效益上是相对平衡的选择。

       随着时间的推移,团队意识到最小测试集的价值不仅仅是应对当前的问题,更是一种方法的积累。因此,当团队面临其他项目需要类似的测试集时,决定将这部分工作自动化。通过自动化最小测试集,可以辅助质量保障团队提高测试回归效率,减少人力投入,并且在项目交付时间上保持敏捷的节奏。

       综上所述,通过人工创建最小测试集解决了敏捷开发中新旧功能影响的问题,并在此基础上将这个过程自动化,为质量保障团队的测试工作提供了有效的支持和帮助。



实现高效的 Web 端到端(End-to-End)UI 自动化测试

        Web 端到端(End-to-End,简称 E2E)UI 自动化测试是现代软件开发中不可或缺的一环。它可以确保整个应用在用户角度下的正常运行,但也需要正确的方法和工具才能发挥最大价值。在本篇博客中,我们将探讨如何实现高效的 Web E2E UI 自动化测试。


理解 E2E UI 自动化的价值

        E2E UI 自动化测试是模拟真实用户操作的测试方法,能够捕捉应用在不同页面、功能和交互下的行为。这对于确保软件的功能性、稳定性和一致性至关重要。然而,E2E 测试并非简单的录制和回放操作,而是一项需要深思熟虑的任务。


选择合适的自动化测试框架

       选择适合项目的自动化测试框架是成功实现 E2E UI 自动化测试的第一步。以下是一些流行的框架:

Selenium:Selenium 是一种广泛使用的自动化测试框架,支持多种编程语言。它能模拟用户在浏览器中的行为,对于 Web 应用的 E2E 测试非常有用。


Cypress:Cypress 是一个现代的 E2E 测试框架,专注于提供快速、稳定和可靠的测试体验。它具有强大的调试能力和易于使用的 API。


Playwright:由 Microsoft 推出的 Playwright 提供了跨浏览器的自动化测试解决方案,支持 Chrome、Firefox 和 WebKit。它的速度和可靠性备受开发者青睐。


选择框架时,考虑到项目需求、团队熟悉度和框架特点都是关键因素。值得一提的是,团队2019年选择了 Cypress,那时 Playwright 社区尚未广泛流行。经过深思熟虑的选型将为项目的成功实施奠定坚实基础。


设计可维护的测试用例:

       设计最小测试集,在每周 1-2 次交付情况下,需要对开发过程中未评估到的改动波及的影响范围进行覆盖,在beta 环境测试完成后进行封板并进行最小测试集的覆盖,减少改动波及的线上问题。


图片


       结合刚才的最小测试集来设计自动化测试用例,编写可维护的自动化测试用例对于长期维护和持续交付至关重要,可以参考以下一些建议:

  • 良好的定位策略:使用唯一的 CSS 选择器、XPath 或测试 ID 来定位元素,避免使用依赖于特定页面布局的选择器。

  • 抽象封装操作: 使用 POM(Page Object Model)来设计用例封装,使测试用例更易读和维护,工程目录参考:

图片


  • 数据驱动测试:使用数据驱动的方法来运行同一测试用例的不同数据集,从而增加测试用例的覆盖范围。

  • mock 数据:使用模拟数据来模拟各种场景,提高测试的全面性。

图片


并行执行测试:

      并行执行测试可以显著提高测试执行速度,减少整体测试周期。多数自动化测试框架都支持并行执行。通过拆分测试套件、利用分布式执行,甚至结合云服务,可以将测试执行时间大幅缩短。为了进一步优化资源利用和确保测试任务均匀分布,还可以考虑引入Pod亲和性策略,减少节点资源过高情况,更好分散测试任务的负载,提高整体性能和稳定性。


k8s job参考,通过配置parallelism设置多个 pod 并行运行:

图片


持续集成和持续交付:

       将 E2E UI 自动化测试集成到持续集成和持续交付流程中,可以在每次代码提交后自动触发测试,从而及早发现潜在问题。使用 CI/CD 实现自动化测试的无缝集成。


流程参考如下:

图片


增强稳定性:

1、确保稳定性和版本控制:Cypress 与 Docker 的结合

       我们早期使用了 Cypress 自动化测试工具,版本为9.5.0。然而,随着时间的推移,Cypress 的版本已经更新到了12.x,这为我们带来了新的功能和改进。但是,如果我们不对测试用例进行及时维护和更新以适应新版本,就可能导致部分用例因为接口变更而产生问题,从而影响测试结果的可靠性。

       为了解决这个问题,我们采取了一种策略,即使用版本控制来稳定测试环境。我们决定将当前稳定的 Cypress 版本(9.5.0)与相应版本的 Chrome 打包成一个 Docker 基础镜像。这样,我们可以将这个版本控制的镜像从多个项目中抽离出来,独立作为一个服务运行。这样做的好处是,不同项目可以随时下载并使用这个稳定版本的镜像,确保测试环境的一致性和稳定性。

       通过将稳定的测试环境与版本控制相结合,我们可以在不同的项目中保持一致的测试环境,从而减少由于不同项目之间的环境差异而引起的问题。这也为我们提供了一个可靠的基础,以便在新版本发布时更加平稳地进行迁移和更新。


2、增强稳定性:异常处理和重试机制

        通过引入异常处理和重试机制,我们能够更好地应对复杂场景下的不确定性,提高自动化测试的健壮性和稳定性。这使得我们的测试流程更加可靠,能够在各种情况下保持一致的表现。


图片


3、定期维护及优化:

       在测试流程中,用例的设计和维护扮演着至关重要的角色。采用了用例设计模型和Page Object Model(POM)后,后续的维护和改进将更加便捷高效。

       随着应用不断迭代,页面布局和功能会随之发展变化,这可能导致之前编写的测试用例失效。因此,我们需要定期进行用例的维护和优化工作。这个过程包括修复断言、更新元素定位策略等。通过这些举措,我们能够确保测试用例的稳定性和可维护性,从而与应用的变化保持同步。

要实现这一目标,以下是一些具体的操作建议:

  • 审查用例设计模型和POM:定期回顾用例设计模型和Page Object Model,确认其是否仍然准确地反映了应用的最新状态。如果有变化,即时更新,以保持一致性。

  • 执行测试用例:周期性地运行测试用例,及时检测出因应用变化而导致的失败。这有助于快速定位和解决问题。

  • 断言修复与元素定位策略更新:对于因页面变化而导致的断言失败,及时进行修复。如果页面元素的定位策略不再有效,更新它们,以确保测试用例能够准确地找到目标元素。

  • 代码重构与优化:定期检查测试用例代码,将冗长重复的代码进行优化,提高代码的可读性和可维护性。这有助于未来维护工作的效率。

  • 版本控制和记录变更:使用版本控制系统跟踪测试用例的更改,并记录每次修改的原因和影响。这有助于团队协作和问题溯源。

       通过上述方法,我们能够保持测试用例的健壮性,使其在应用迭代的同时依然有效。持续的维护与优化工作有助于提升测试流程的稳定性和效率,为应用交付质量提供可靠保障。


监控和反馈:

1、自动化测试与问题排查:结合迭代情况进行报错原因分析

      在自动化测试的过程中,出现问题时需要进行详细的排查和分析,以确定问题的根本原因。为了判断是否是自动化测试发现的bug,我们需要综合考虑以下几个方面,并结合项目迭代的情况进行分析:

  1. 用例设计的合理性:首先,我们需要审查测试用例的设计是否合理,以确保测试覆盖了预期的场景和功能。如果测试用例设计存在不足或遗漏,问题可能并非是真实的bug,而是测试用例未考虑到的情况。

  2. 迭代变更影响:考虑到项目在不断的迭代中会引入新功能、修改现有功能等变更,我们需要了解迭代中的变更内容。通过结合迭代情况,可以更准确地分析问题是否与新的变更相关。

  3. 问题重现步骤:在分析问题时,需要明确问题的重现步骤,以便复现问题并定位根本原因。自动化测试用例的执行步骤录屏可以作为问题重现的一个重要参考。

  4. 日志和报告分析:自动化测试的执行日志和报告中可能会记录下问题的相关信息,包括错误信息、堆栈轨迹等。通过仔细分析这些信息,可以帮助我们定位问题。

  5. 与开发团队协作:如果确认问题是真实的bug,需要及时与开发团队进行沟通。将问题详细记录下来,并提供复现步骤、日志等信息,以便开发团队进行修复。

  6. 修复验证:一旦开发团队修复了问题,我们需要对修复进行验证。可以通过重新运行相关的自动化测试用例来验证问题是否已经被解决。

      通过综合以上因素,我们可以判断是否是自动化测试发现的真实bug。如果确认是问题,及时与开发团队协作进行修复,从而确保问题得到解决。


结合当前迭代,分析自动化问题,提供复现步骤,参考如下:


图片

(PS:因图片限制有所删减


2、持续优化:收集、分析和完善自动化问题反馈

       为了不断优化自动化测试流程,我们采取了多种策略来收集、分析和处理相关的问题反馈。这些策略不仅有助于发现未预测到的改动影响,还能够提高开发自测效率以及在测试环境中发现问题的能力。

       除了最小测试集用于 beta 环境的封板测试外,还可以引入了全流程的自动化测试用例。这些用例涵盖了应用程序从开始到结束的整个流程,以确保各个部分之间的协同工作以及不同功能的正确性。通过执行全流程的自动化测试,我们可以在早期阶段就发现可能存在的问题,从而减少后期修复的成本。

       在收集问题反馈方面,我们将线上问题和测试问题进行分类、记录并进行分析。这使我们能够识别出一些重要的问题模式和趋势,从而更加有针对性地改进自动化测试用例和流程。而对于开发自测,我们鼓励开发人员在提交代码之前运行相关的自动化测试用例,从而能够自行发现并解决潜在问题,减少代码集成时的问题出现。

       最终,这些策略相互配合,帮助我们不断优化自动化测试流程,提高测试的覆盖范围和准确性。同时,它们也为开发团队和测试团队提供了更多的反馈信息,以便能够更快速地解决问题并进行持续改进。


图片


图片
图片


3、通过率分析和阈值监控

       设定查询条件分析近期的通过率情况,设定阈值查看最低合格通过率或警戒线是否达标需要优化和更新用例。


grafana中查看通过率示例:


图片

(PS:因图片限制有所删减




图片

结语

       E2E UI 自动化测试是确保软件质量的关键环节,但它需要正确的方法和工具来实现最佳效果。选择合适的框架、设计良好的测试用例、并行执行测试以及持续集成都是实现高效 E2E UI 自动化测试的关键步骤。通过不断的维护和优化,E2E 测试将成为QA人员交付稳定、高质量软件的有力支持。

       希望这篇博客能够帮助您更好地理解和实践 Web 端到端 UI 自动化测试。如果您有任何问题或想要进一步讨论,欢迎在下方评论区留言交流!





END

图片


继续滑动看下一个
高途技术
向上滑动看下一个