继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

设计测试自动化框架的最佳实践指南

手掌心
关注TA
已关注
手记 273
粉丝 18
获赞 76

图片来自(DALL-E)

1. 简单点 KISS 原则

你的自动化框架最好是简单明了的,易于理解。

  • 将复杂的测试分解为更小的、可重用的模块。这样可以使得代码片段更易于理解、维护和重用。
  • 给测试用例、方法和变量选择有意义的名字。
  • 避免过度工程。尽量不要添加不必要的复杂性,比如多余的模式或抽象,除非它们解决了当下的问题。

过度设计示例:使用单例模式来实现WebDriver会增加不必要的复杂度。当你需要并行测试时,这会让每个测试共用同一个WebDriver对象,这会带来一些问题。

static关键字在测试中会阻止并行测试执行。当你使用静态对象(尤其是可变对象如 WebDriver)时,意味着测试无法同时进行,因为它们共享同一资源。这会阻止并发测试并减慢你的测试套件执行速度。为了实现并行测试,避免使用静态对象(如 WebDriver),确保每个测试都能独立运行,不相互干扰。

2. 模块化

一个测试自动化框架应当采取模块化的方式,其中组件应当松散耦合。框架中一个部分的改动不会影响到其他部分。这意味着测试数据、实用的方法、页面对象和测试执行应该各自独立,成为单独的模块。

例子

  • 创建一个用于 处理测试数据 的模块:将所有测试数据放置在外部文件中,如 JSON 或 XML 文件。
  • 创建一个用于 工具 的模块:常见的函数,如读取 JSON 文件或截屏,可以放在这里。
  • 创建一个用于 测试用例 的模块:所有的测试用例都放在这里,可以使用 TestNG 注解编写。
  • 使用 页面对象模式 进行 UI 自动化:POM 将测试逻辑与页面结构分开。每个网页由一个 Java 类表示,其中包含网页元素作为变量和用于与它们交互的方法。这简化了 UI 更改时的维护工作。
3. 通过 API 或数据库来管理测试数据及条件

在进行UI自动化测试时,最好通过API或数据库来准备测试数据和预条件,而不是通过UI本身。与通过API或数据库驱动的测试相比,UI测试更脆弱。通过API或数据库设置测试数据比通过UI导航更快,从而减少了整体测试执行时间。通过将数据设置分离,UI测试可以专注于需要测试的内容:用户界面。这将使测试更专注和更准确。

4 避免在自动化测试框架中使用 Excel表格

不要在自动化框架中使用 Excel 来管理测试数据,原因有几方面,有几个原因。

  1. 版本控制和协作上的挑战
    Excel 文件在 Git 这样的版本控制系统中较难管理,导致协作困难。
  2. 性能问题
    Excel 在读写速度上比 JSON、XML 或数据库等格式慢,使测试执行速度变慢。
  3. 数据完整性
    Excel 文件容易被损坏或格式错误,导致测试失败。文本格式更为可靠。
  4. 不适合处理复杂数据
    在 Excel 中处理复杂数据结构比较困难,JSON 和 XML 更适合处理这种情况。
  5. 自动化支持有限
    处理 Excel 需要额外的库,增加了框架的复杂性及依赖性。
  6. 持续集成难度大
    将基于 Excel 的测试集成到 CI/CD 管道中比使用代码框架更具挑战。

使用 JSON、XML、数据库或 CSV 等替代方案可以让您的自动化系统更快、更易于管理,且更稳定。

5. 使用设计模式 - 自动化测试设计模式

(设计模式)可以提高测试自动化框架的结构清晰度和可维护性,从而提高效率和代码质量。

工厂模式
工厂设计模式是一种灵活且可重用的方式,用于以灵活且可重用的方式创建对象。想象你有一个超类带有多个子类,根据某些输入,你需要返回特定子类的一个实例。工厂设计模式通过工厂类来创建这些对象,从而帮助你实现这一点。

  1. 父类和子类:我们有一个父类(例如 Driver)和多个子类(例如 AndroidDriverIOSDriver)。
  2. 工厂类:一个工厂类(例如 DriverFactory)根据输入(如平台类型)创建这些子类的实例。

策略模式
策略模式是一种行为模式,它允许你定义一系列算法,将每一个算法封装起来,并使它们可以互相替换。这种模式让算法能够独立于使用它的客户端而变化。

你正在开发一个自动化测试框架,该框架需要支持不同的浏览器进行测试。而不是为每一种浏览器单独编写代码,你可以使用策略模式来实现定义各种浏览器的具体策略,并轻松地在它们之间进行切换。

建造者模式:帮助我们一步步地构建复杂的东西。

Java 设计模式实例教程 YouTube 列表。

6. 使用如SonarLint之类的静态代码分析工具

像 SonarLint 这样的工具可以帮助发现代码中的潜在问题,比如 bug、安全漏洞等。

例如:SonarLint 可以突出显示诸如未使用的变量和函数等潜在问题,这有助于保持代码的清晰和高效。它直接与您的IDE集成,并在您编写代码时提供即时反馈。

7 数据驱动测试 (https://testsigma.com/data-driven-testing)

采用数据驱动的方式可以让你对多组数据执行相同的测试脚本。这提高了脚本的重用性,并且可以在较少的努力下确保更广泛的测试覆盖。

8. 异常处理和日志

正确的异常处理和日志记录对于理解测试失败非常重要。框架中的每个动作都应该被记录下来,测试失败时应抛出有用的异常。

9. 确定要自动化的测试

重点放在那些可预测、重复且重要测试上,以提高效率和准确性。目标应该是识别那些适合自动化的测试,而不是需要自动化所有可能的测试。

  • 选择那些经常执行的测试。
  • 对于 UI 自动化,尽量自动化那些覆盖你业务核心路径的测试。
  • 创建可以在任何顺序下运行或并行执行的独立测试,这有助于提高测试套件的性能,增强其可靠性并简化调试过程。
  • 每个测试都应该自己设置预条件并清理环境,确保在下一个测试开始前环境处于干净的状态。
  • 每个测试必须独立,不依赖于先前测试的结果。
10. 在UI自动化中的等待命令
  • 避免像 Thread.sleep() 这样的硬编码等待时间
    避免使用像 Thread.sleep() 这样的硬编码等待时间,因为它们会使测试变得缓慢且不可靠。
  • 集中等待逻辑
    创建一个专门的等待工具类来封装所有的等待逻辑,使其更容易维护和修改。
  • 使用显式等待而不是隐式等待
    专注于等待特定条件满足,例如某个元素可点击或可见。
  • 参数化超时时间
    允许根据不同的情况自定义超时时间,并设置合理的默认值。
  • 超时策略
    设置现实的超时时间以避免长时间的延迟。选择一个平衡点,确保元素能加载但又不会使测试变慢。过度使用等待(即使是显式的等待)会使测试变得迟缓。只等待必要的条件,并优化轮询时间间隔
11. POJO 类用于 API 自动化测试

使用POJO(普通的Java对象)在API自动化中有诸多好处。虽然有些团队可能会因为简单而跳过使用POJO类,但使用它们的理由很充分。

  • 强类型和编译时的安全性
    POJO 类提供了强类型,确保你处理的数据具有明确的结构。编译时错误可以在早期捕获类型不匹配或缺少字段等问题,避免在直接处理 JSON 时出现的运行时错误。
  • 代码可读性和可维护性
    使用 POJO 时,数据结构清晰,使代码更易读且更易于维护。
    这避免了需要通过嵌套的映射或 JSON 字符串来提取字段,这对于复杂的 API 来说,可能会变得易错且不可读。
  • 更简单的重构过程
    当 API 响应发生变化时,你只需更新 POJO 类,而不需要在代码的多个地方进行修改。
  • 完整响应验证
    POJO 类可以用于自动映射并验证整个 API 响应。工具如JacksonGson允许进行 JSON 到对象的转换,并验证字段类型。
    这可以防止部分验证问题,当你手动检查 JSON 结构时,可能会遗漏某些字段。

长期来看,使用POJOs进行API自动化是一种更可扩展、易于维护且健壮的方法。虽然这可能会带来一些初始的创建负担,但在可读性、测试结构、类型安全和灵活性方面的优势远远超过了投入的时间和精力。跳过POJOs在某些情况下可能有效,但对于复杂且API不断变化的应用来说,POJOs提供了更好的控制和灵活性,并减少了不稳定的或脆弱测试的可能性。

12. 遵循DRY原则(不要重复代码)
  • 避免重复使用定位器(XPath
    将定位器集中管理和存储在页面对象类中,而不是在多个测试用例中重复它们(定位器)。
  • 明智地使用继承
    当不同测试需要使用相同的公共功能时,可以利用继承来共享相同的函数。但要注意不要过度使用继承,以免造成紧密耦合。
  • 可重用的测试设置和清理
    使用一个基础测试类来统一设置和清理测试环境,而不是在每个测试中重复设置相同的逻辑。
    识别那些在多个测试用例中重复出现的测试步骤,并将它们提取成可重用的方法或函数。
13. 独立测试

独立的测试不仅使并行执行成为可能,还让维护更加便捷。虽然完全独立可能并不总是现实,但设计能够单独运行的测试用例被视为最佳实践。这种方法提高了可靠性,减少了依赖,并允许进行更快更高效的测试。

14. 避免硬编码 — 使用配置文件

把 URL、凭证等数据放在配置文件里,而不是直接写死。

15. 按照SOLID原则来

遵循SOLID原则能够提升代码的可维护性和灵活性。

16. 定期回顾和重构
  • 定期检查并更新您的测试自动化框架: 这可以确保其保持有效并适应不断变化的需求。
  • 识别改进领域: 寻找优化性能、增强可维护性或增加测试覆盖率的机会。
  • 保持您的框架使用最新的技术和工具: 更新过时的库和工具。
  • 删除冗余或不必要的代码: 精简您的测试脚本以提高效率。
  • 确保您的测试充分涵盖所有相关场景。 改进测试覆盖率。
17. 报告 (点击)

您的报告应该可以自定义。并不是所有的项目都需要一样的详细程度,所以报告应该可以配置显示或隐藏部分内容,比如屏幕截图、日志文件或者环境信息。

优化那些运行缓慢或经常失败的测试,以改善你的测试过程。

在报告的顶部包含总结统计信息,以快速了解测试的整体执行情况。

18. 黄瓜——其实不是自动化测试工具

许多组织错误地使用了Cucumber,导致不必要的复杂性而没有达到BDD预期的好处。除非完全致力于BDD流程,否则请使用更简单的工具或方法。

19. 选择恰当的自动化工具

选错工具可能会影响项目的成功。工具的选择应根据项目的具体需求,而不是看它是否流行。

20. 使用小而专注的测试,仅测试单一的功能点或组件。

自动化原子测试(AAT,Automated Atomic Tests 的简称)是小巧且专注的UI测试,用于快速验证单一功能,从而缩短测试执行时间并提高可靠性,通过将复杂场景分解为独立且快速运行的测试,这些测试能够并行运行。

优点:

  1. 快速失败法
  2. 减少测试的不一致,更易于维护
  3. 并行运行测试,提高性能
  4. 显著缩短总测试执行时间
21. 测试自动化金字塔简介

浏览器栈指南:测试自动化金字塔

  • 专注于底部的单元测试(最快、最可靠)
  • 中间的API测试较少
  • 顶部的UI测试最少
22. 如何让你的测试数据保持干净

(https://www.workwithloop.com/blog/keeping-your-test-data-clean-with-beforeeach-and-aftereach)

为每个测试创建和删除测试数据,这可以确保:

(注:原文可能希望表达更完整的意思,此处翻译为直译,具体可根据上下文调整为更自然的表达。)

  1. 测试隔离:每个测试独立运行,不受其他测试生成的数据干扰。
  2. 一致性:测试从已知状态开始,使其更可靠且更容易调试。
  3. 并行执行:测试可以并行运行且不互相干扰,从而加快测试套件的执行速度。
23. 数据驱动的API测试
  1. 使用真实数据:理解API背后的企业逻辑和数据处理过程,从而创建真实的测试场景。
  2. 使用数据驱动动态断言:避免硬编码预期结果。使用动态断言可以更好地适应不同的测试场景,使测试更灵活和易于维护。
  3. 记录API响应:记录并存储API响应,以维护测试结果的历史记录。这有助于识别问题何时何地被引入,从而使得调试更加容易。
  4. 重用数据驱动的功能测试进行性能和安全测试:可以重新利用你的数据驱动的功能测试来进行性能和安全测试。这为这些测试增添了真实性,并最大化了你初始投资的价值。

这些建议仅供参考,根据您组织的具体需求灵活运用。

更多关于测试自动化最佳实践的文章。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP