Architecture Decision Record

Active theme: Light

← 决策记录示例

架构决策记录:用于端到端测试的浏览器自动化框架(Playwright 与 Selenium)

1. 背景

我们正在为端到端(E2E)测试流水线选择浏览器自动化框架。该框架将是我们 CI/CD 流程中不可或缺的一部分,用于运行模拟真实用户在我们平台上交互的测试。具体而言,测试将涵盖用户注册/登录、文件上传、仪表板交互和报表下载等场景。

作为一家初创公司,我们的重点是敏捷开发,需要快速迭代和演进。我们的团队主要使用 TypeScript 和 Python,因此能够用这些语言编写测试至关重要。此外,平台包含交互式图表和仪表板,因此自动化工具必须能很好地支持丰富的动态 UI。

这项任务的两个竞争者是 Playwright 和 Selenium,各有其优势和权衡。我们需要根据下文列出的功能和需求来评估这两个框架。

2. 考虑过的选项

  • Playwright(由 Microsoft 开发)
  • Selenium(由 Selenium 项目开发)

3. 决策驱动因素

影响我们决策的因素如下:

  1. 敏捷开发:所选工具必须支持快速、灵活的开发周期。
  2. 语言支持:我们的团队需要同时支持 TypeScript 和 Python。
  3. 交互式 UI 测试:能够可靠地测试交互式图表、仪表板和动态元素至关重要。
  4. 运行速度:虽然不是首要关注点,但在 CI/CD 流水线中的性能也是一个考虑因素。
  5. 可扩展性:我们近期并不打算大规模扩展,但希望确保该方案能应对未来的增长。
  6. 向后兼容性:遗留系统和对旧版浏览器的兼容性目前对我们的项目并不关键。
  7. 移动端测试:虽然不是当前的重点,但该框架应能够测试移动端响应式功能,或可扩展以支持此类场景。
  8. 多显示器测试:对多显示器配置的支持是次要需求,特别是如果我们将来扩展到测试更复杂的用户工作流。
  9. 文件上传测试:框架必须高效地处理文件上传,这是我们测试需求的核心要求。

4. 评估标准

  • 易用性:编写和维护测试有多容易?
  • 语言支持:框架是否支持 TypeScript 和 Python,即我们团队最常用的两种语言?
  • 交互式 UI 测试:框架处理图表、文件上传和动态数据等复杂交互式用户界面的能力如何?
  • CI/CD 集成:框架与常见的 CI/CD 工具和服务的集成程度如何?
  • 跨浏览器支持:支持哪些浏览器,表现如何?
  • 性能和速度:测试运行得有多快,特别是在 CI/CD 流水线中?
  • 可扩展性:如果添加更多测试或更复杂的场景,框架的扩展能力如何?
  • 社区和生态系统:框架的社区有多活跃?是否有大量可用的集成和扩展?

5. 考量

5.1 Playwright

优点:
  1. 更智能的本地文件上传 API:Playwright 用于与本地文件交互和执行文件上传的 API 更简单、更直观。这将使文件上传测试更易于实现和维护。
  2. 语法和代码生成:Playwright 的语法更短、更简洁。这减少了样板代码,从而提高了可维护性和开发效率。此外,这种较短的语法还提升了 OpenAI 代码生成的质量,使自动生成测试脚本更加容易。
  3. 交互式 UI 测试:Playwright 擅长测试动态、交互式的 Web 应用,例如具有丰富图表、复杂用户交互和实时更新的应用。它能非常有效地处理 WebSocket、WebRTC、Shadow DOM 及其他现代 Web 技术。
  4. 跨浏览器支持:Playwright 支持 Chromium、WebKit 和 Firefox。它在这些浏览器上表现一致,应能满足我们大部分的测试需求。
  5. CI/CD 集成:Playwright 可与现代 CI/CD 平台(GitHub Actions、Jenkins 等)无缝集成。它可以在不同的浏览器上并行运行测试,优化测试运行时间,适合快速开发。
  6. 快速且可靠:Playwright 总体上比 Selenium 更快,尤其是在无头模式下,并且在处理异步 Web 元素时更具弹性。
缺点:
  1. 移动端测试有限:虽然 Playwright 确实支持浏览器的移动端模拟,但它缺乏原生移动端测试能力,不像 Selenium 那样可通过与 Appium 集成实现真正的移动端测试。
  2. 生态系统较小:Playwright 仍较新,不如 Selenium 成熟。虽然它的社区增长迅速,文档也不错,但它可能还没有 Selenium 所提供的庞大插件和集成生态系统。
  3. 浏览器支持有限:虽然 Playwright 涵盖了主要的现代浏览器(Chrome、Safari、Firefox),但它对旧版浏览器(例如 Internet Explorer)的支持不如 Selenium 稳健。

5.2 Selenium

优点:
  1. 历史更长、更成熟:Selenium 已经存在很长时间,有着久经验证的业绩记录。它被许多团队和行业广泛使用,从而形成了庞大的插件、集成和资源生态系统。
  2. 跨浏览器和跨平台支持:Selenium 支持种类繁多的浏览器及其版本,包括 Internet Explorer,还可以与 Docker、Selenium Grid 和云服务等各种工具集成,用于分布式测试。
  3. 移动端测试:Selenium 通过与 Appium 集成,在移动端测试(包括 Android 和 iOS 应用)方面要稳健得多。这使它成为移动优先或以移动为主的项目的更佳选择。
  4. 多显示器测试:Selenium 对涉及多显示器或复杂多窗口交互的场景提供了更好的支持。
缺点:
  1. 复杂性:Selenium 的 API 更冗长、更显式。虽然这在某些情况下是优势,但也意味着需要编写和维护更多代码,这可能会降低开发敏捷性——这在初创环境中尤为重要。
  2. 性能:Selenium 通常比 Playwright 运行得慢,尤其是在无头模式下。这可能会影响 CI/CD 流水线,特别是随着测试数量的增加。
  3. 交互式 UI 测试:在测试现代交互式 Web UI(尤其是带有图表和实时数据更新的 UI)方面,Selenium 不如 Playwright 流畅。要可靠地与动态内容交互,它需要更多的设置和处理。

6. 对比总结

特性 Playwright Selenium
易用性 语法更短,对现代 UI 更直观 更显式,需要更多样板代码
语言支持 TypeScript、Python、JavaScript TypeScript、Python、Java、Ruby、C#
交互式 UI 测试 非常适合动态、实时的 UI 可处理基本 UI,但对丰富交互更冗长、更复杂
文件上传测试 更智能的文件上传 API 更冗长,API 不够直观
CI/CD 集成 易于与 GitHub Actions、Jenkins 集成 与许多 CI 工具有很强的集成
移动端测试 有限,仅支持模拟 通过 Appium 提供完整支持
跨浏览器支持 Chromium、WebKit、Firefox 完整支持主流和旧版浏览器
性能 快速,针对无头测试进行了优化 较慢,尤其是在无头模式下
多显示器测试 有限 对多显示器配置支持良好
社区和生态系统 不断增长,文档良好 庞大、成熟、生态系统广泛

7. 决策

在考虑了需求和权衡之后,Playwright 是满足我们当前需求的更好选择。其更智能的本地文件上传测试 API、简洁的语法以及对交互式 UI 测试的强力支持,使其非常适合我们的敏捷开发周期。它同时支持 TypeScript 和 Python,这对我们的团队至关重要,而且该框架的现代测试方式将使我们能够编写整洁、可维护的代码。

虽然 Selenium 仍然是一个很好的工具,尤其是在移动端测试、旧版浏览器支持和多显示器设置方面,但它不太适合我们当前的需求。它的冗长、较慢的性能,以及对图表等动态 UI 更复杂的处理方式,使其对我们的用例而言不那么理想。

8. 后果

  • 即时行动:我们将采用 Playwright 进行 E2E 测试,重点测试涉及注册、登录、文件上传、仪表板和报表下载的用户流程。
  • 长期考虑:我们将密切关注 Playwright 生态系统的演进。如果我们的需求发生变化,特别是在移动端测试或旧版浏览器支持方面,我们可能会重新考虑 Selenium。
  • 培训和文档:开发团队需要熟悉 Playwright 的 API,特别是用于处理动态 UI 和文件上传的部分。
  • 迁移:现有的 Selenium 测试(如有)将逐步迁移到 Playwright。

9. 未来的考虑