什么是自动化测试
自动化测试是利用脚本和工具执行预定义的测试步骤,以验证软件是否符合预期行为。通过自动执行测试,可以提高测试效率、减少人为错误和确保软件质量。
- 单元测试:单元测试是对软件中最小可测试单元(通常是函数或方法)进行测试的过程。它旨在确保每个单元的功能正常,从而提高代码的可维护性和稳定性。
- 集成测试:集成测试涉及将多个单元或组件组合在一起,并测试它们在协同工作时是否能够正确运行。这有助于发现不同单元之间的交互问题,并确保整个系统的一致性。
- 自动化测试:利用脚本和工具执行预定义的测试步骤,以验证软件是否符合预期行为。通过自动执行测试,可以提高测试效率、减少人为错误和确保软件质量。
测试框架选择
自动化测试框架原理
选择框架前我们先了解一下不同的测试框架原理有哪些:
1. 直接在浏览器中运行测试
- 对应的测试框架:Cypress
- 运行原理:使用 Cypress 测试代码直接运行在Cypress 全权控制的浏览器中(实际上是运行在运行在同一个 Domain 中的不同 iframe 内),所以Cypress 可以直接应用的 DOM、JavaScript、网络请求、windows object甚至 LocalStorage。
- 优势
- 执行超快,稳定性高
- 十分轻量,简单易学
- 缺点
- 只支持 chrome 内核浏览器
- 对 iframe支持不是很好
- 不支持多个标签页的测试
2. 使用 Webdrive控制浏览器
- 对应的测试框架:Selenium、nightWatch、AirTest
- 运行原理:WebDriver 是一种用于自动化浏览器的工具和协议,它定义了一套标准化的接口,使得开发者能够通过编程方式控制浏览器行为。WebDriver 不涉及浏览器内核的底层实现,而是通过与浏览器的驱动程序通信来实现对浏览器的控制
- 优势:
- 技术成熟,2004 年发布,在 playwright 出现之前是最主流的自动化测试方案
- 支持众多浏览器,Chrome、Firefox、Safari、IE、Opera等
- 支持众多编程语言:Java、C#、Python、Ruby、NodeJS等
- 缺点
- 速度较慢
- 使用起来比较麻烦,需要熟悉 selenium api
3. 使用 Chrome DevTools Protocol控制浏览器
- 对应框架:Puppeteer、PlayWright
- 运行原理:CDP 是一组协议,用于与 Chromium 浏览器及其衍生浏览器(如 Google Chrome)进行通信。CDP 提供了一种底层的、更细粒度的控制方式,允许开发者直接与浏览器的底层交互,实现一系列高级的开发者工具功能。CDP 可以用于追踪网络请求、执行 JavaScript、监控性能等。
- 优势
- 支持多浏览器
- 直接与浏览器通信,速度更快
- 直接访问浏览器特性,可以实现复杂场景的测试
- Puppeteer/PlayWright 简单易用
- 缺点
- 相对较新,尚未像Selenium那样经历了长时间的稳定性验证和广泛的应用,但是随着近几年社区的不断完善,该方案日渐成熟,可以放心使用
webdrive 和 DevTools Protocol 的区别可以大致理解成一下这个图(图来自这里)
主流测试框架对比
| 测试框架 | 描述 | 维护团队或公司 | 社区活跃度 | 自带断言库 | 支持的浏览器 | 使用的语言 | 是否支持记录和回放 | 测试原理 | 功能 |
|---|---|---|---|---|---|---|---|---|---|
| Puppeteer | 由 Google 开发,专注于 Chrome 浏览器的自动化测试,支持 Headless Chrome。 | 活跃,有强大的社区和维护者支持 | 否(通常结合测试框架使用) | Chrome, Firefox, Safari, Edge, ... | JavaScript / TypeScript/Node.js | 否 | DevTools 协议 | 可以满足大部分自动化测试功能,实际上用来做爬虫比较多 | |
| Playwright | 由 Microsoft 开发,支持多种浏览器的自动化测试,适用于 Web 测试。 | Microsoft | 活跃,得到了 Microsoft 和社区的支持 | 是 | Chromium, Firefox, Safari,Edge... | JavaScript and TypeScript/Python/C#/Java | 是 | DevTools 协议 | 支持跨浏览器,支持多种语言,简单易用,性能好,可以完美的进行前端自动化测试 |
| Cypress | 现代 Web 测试专注的端到端测试框架,提供可靠的测试体验。 | Cypress.io | 活跃,社区支持良好 | 是 | Chrome, Electron,Webkit | JavaScript/TypeScript | 是 | 直接运行在浏览器上 | 直接运行在浏览器上,但是支持的浏览器没那么多,不支持多个标签页测试,更适合单页面前端自动化测试。轻量、高效、易用 |
| AirTest | 面向移动应用测试的 UI 自动化测试框架,支持 Android 和 iOS,同时逐渐增强 Web 功能。 | NetEase | 在移动应用测试领域较为活跃,Web 功能也逐渐增强 | 是 | Chrome, Firefox, Safari, Edge, ... | Python | 是 | 通过 selenium drive 控制浏览器 | 通过 airtest-selenium 控制浏览器,可以满足大部分测试场景,AirTestIDE 大大提升了测试用例的编写效率(但是在 mac 上功能不全),AirTest 主要用于测试移动端的,测试 Web 功能是否完善还待调研 |
| Selenium | 行业标准的自动化测试框架,适用于 Web 应用程序和浏览器测试,支持多种浏览器。 | SeleniumHQ | 长期活跃,有大量用户和社区支持 | 否(通常结合测试框架使用) | Chrome, Firefox, Safari, Edge, ... | 多语言(主要支持 Java,也有其他语言绑定) | 否 | 通过 webdrive 控制浏览器 | 成熟的前端 UI 自动化测试方案,但是 api 相对复杂,使用起来比较麻烦 |
| Nightwatch | 提供简化 Web 测试流程的自动化测试框架,易于使用和扩展,支持多种浏览器。 | Nightwatch.js | 活跃,有社区支持 | 是 | Chrome, Firefox, Safari, Edge, ... | NodeJS | 否 | 通过 selenium drive 控制浏览器 | 基于 selenium 的基础上封装一套更加简单易用的 api,支持 NodeJs 开发,对前端开发十分友好 |
| CodeceptJS | 多用途自动化测试框架,支持行为驱动开发(BDD)和测试自动化。可用于 Web,移动和 API 测试。 | Codeception | 活跃,有强大的社区支持 | 是 | Web端测试框架 | NodeJS / PHP | 是 | 封装了一套自己的 api 来驱动 Puppeteer、PlayWright、Appium 等 | 运行在nodejs的UI测试框架,有自己的一套 API,实际上还是驱动其他测试框架来完成测试 |
| Flybirds | 一个轻量级的测试框架,用于简化 Web 自动化测试流程。 | 携程 | 携程机票开源的跨端测试框架,社区相对没那么活跃 | 是 | 多端测试框架 | python | 是 | 通过适配AirTest、Playwright等框架来实现跨端自动化测试 | 携程机票开源的跨端自动化测试方案,更像是一套工程化方案,实际上用的还是 AirTest、PlayWright 等测试框架 |
结论
最终笔者选择的框架是PlayWright,原因/优势如下:
- 支持主流的浏览器,可以测试浏览器兼容性
- 支持NodeJS,对前端更加友好
- 简单易用,支持通过录制的方式生成测试用例,提升测试用例编写速度
- 方便调试,测试过程支持录屏、截屏、输出测试报告
- 支持并发,使用 CDP 协议,速度更快
- 由微软开发维护,社区活跃度高,长期维护支持,遇到问题能更好的解决
- 支持模拟网络请求
- 支持缓存浏览器cookie(保存登录状态)
- 支持测试 H5 (配置浏览器设备为移动设备打开)
- 支持跨越多个页面、域和 iframe 的场景
- ...
后续会有 Cucumber + Playwright 实践分享,敬请期待。