应用开发中的E2E测试——概念、场景与工具

作者: IT Sectr 发布日期: 2026-04-07 阅读时间: 9 分钟

E2E测试(端到端)从开始到结束检查完整的用户场景,涵盖应用程序的所有层:界面、业务逻辑、网络请求和数据库。与检查组件隔离连接的集成测试不同,E2E测试模拟用户的真实行为——从打开应用程序到完成目标操作。根据Martin Fowler, 2020的研究,E2E测试提供了对系统正确性的最高信心,但需要精心设计以避免脆弱性和过长的执行时间。

要点

  • E2E测试——通过应用程序的所有层(UI、API、数据库和外部服务)检查完整的用户场景。
  • Detox——来自Wix的React Native框架,与JS线程同步,为移动应用程序提供稳定的E2E测试。
  • Appium——跨平台工具,支持WebDriver协议,允许在Android和iOS上运行E2E测试而无需更改代码。
  • Maestro——现代框架,采用YAML场景格式,无需编译,可在10分钟内与CI集成。
  • 测试金字塔将总测试覆盖的5-10%分配给E2E测试,因为它们在时间和维护方面成本最高。

什么是E2E测试?

E2E测试(端到端)是一种软件验证方法,测试通过系统的所有组件遍历完整的用户路径。移动应用程序的典型E2E场景包括:启动应用程序、注册新用户、确认电子邮件、执行目标操作(下订单、发送消息)以及在界面中检查结果。每一步都使用真实组件——没有存根和模拟。

E2E测试的主要优点是它们将系统作为一个整体进行检查,包括客户端、服务器、数据库和外部服务之间的交互。E2E测试能够发现在测试金字塔较低层级无法发现的问题:客户端和服务器之间的数据格式不一致、真实环境中的授权错误以及与支付网关的集成故障。

根据World Quality Report 2023报告,将E2E测试集成到CI/CD流水线中的团队在发布时将关键缺陷数量减少了45%。完整E2E套件的执行时间从20分钟到2小时不等,具体取决于场景数量,这需要精心设计的并行执行策略。

E2E测试与集成测试的区别

主要区别在于检查的边界。集成测试检查应用程序内部两个或三个组件的交互:网络层与存储库、数据库与ViewModel。E2E测试检查整个链:从UI到外部后端再返回。如果集成测试检查对API的请求是否返回正确的JSON,那么E2E测试检查用户在完整加载周期后是否在屏幕上看到这些数据。

维护成本也有所不同。集成测试在受控环境中运行——使用测试存根和内存数据库,这使得它们稳定且快速。E2E测试依赖于外部系统的状态、网络可用性和后端版本,这增加了假性失败(flakiness)的可能性。根据Google Testing Blog (2021),E2E测试平均比集成测试脆弱3-5倍,这需要引入重试机制和稳定性分析。

选择E2E测试还是集成测试取决于场景的关键性。关键用户路径——注册、支付、访问恢复——需要E2E检查。辅助场景——加载列表、更新个人资料——可以通过在单个屏幕级别进行UI检查的集成测试来覆盖。

哪些场景需要用E2E测试覆盖

并非每个用户场景都需要E2E测试。选择标准包括三个因素:路径的使用频率、生产中错误的成本以及涉及的系统数量。每个用户在首次启动时执行的场景(入门引导、注册)是明显的候选。只有5%用户访问的管理面板场景——是集成测试的候选。

  • 注册和登录——完整的账户创建周期,包括电子邮件确认和会话建立。错误会阻止所有新用户。
  • 下订单和支付——检查购物车、选择配送方式、通过外部网关进行支付以及显示确认。
  • 密码恢复——请求重置、接收邮件、输入新密码、使用新数据登录。在服务器逻辑更改时经常损坏。
  • 数据同步——在一台设备上创建记录,检查通过云端同步后在另一台设备上是否出现。
  • 推送通知——接收通知,从中导航到应用程序的相应屏幕,更新通知后的状态。

为每个场景确定最少的E2E测试集——一个快乐路径和一个错误路径(例如,过期的令牌或不可用的服务器)。将E2E覆盖扩展到基本场景之外必须有经济上的合理性:E2E测试的ROI在覆盖10-15个关键路径后下降,因为额外的E2E测试不会带来质量信心的比例增长。

E2E测试工具

移动E2E测试有三类主要工具:平台框架、跨平台解决方案和下一代工具。工具的选择取决于技术栈、团队技能和CI集成所需的速度。

平台框架

XCUITest——Apple针对iOS的原生工具,是Xcode的一部分。iOS最稳定和高效的选项,提供对系统辅助功能层的直接访问。Espresso——Google针对Android的原生框架,是AndroidX Test的一部分。对于E2E场景,Espresso与AndroidX Test Orchestrator一起使用,用于隔离测试和防止相互影响。平台框架的缺点——需要为每个平台单独编写测试。

跨平台解决方案

Appium——基于WebDriver的工具,支持Java、Python、JavaScript和其他语言。Appium的架构包括一个服务器,将命令代理到平台API——Android的UIAutomator和iOS的XCUITest。需要为每个设备配置Desired Capabilities。Detox来自Wix——React Native框架,与JS线程同步并自动等待动画和网络请求完成。Detox与Jest或Mocha集成,无需安装服务器。

下一代工具

Maestro——使用YAML文件描述场景的现代框架。Maestro无需编译,支持热重载,并提供内置的Flow Report用于结果分析。该工具可在10分钟内与CI集成,并自动与应用程序状态同步,与Appium相比显著降低了测试的flakiness。

  • Detox(Wix)——React Native框架,与JS线程同步。支持Android和iOS,自动等待动画和网络请求完成。
  • Appium——基于WebDriver的跨平台工具,支持任何编程语言。
  • Maestro——采用YAML场景的现代框架,无需编译,可在10分钟内与CI集成。

E2E测试代码示例

让我们看看在Maestro中授权场景的E2E测试——增长最快的移动测试工具之一。Maestro使用YAML格式,无需编程语言知识即可编写测试。第二个示例——在Detox中为React Native应用程序进行的E2E测试。

Maestro:YAML授权场景

该场景描述了完整的流程:打开应用程序、输入电子邮件和密码、按下登录按钮以及检查主屏幕的显示。Maestro命令直观易懂,无需配置选择器——框架使用元素的文本进行搜索。

yaml
# E2E:用户登录
appId: com.example.myapp
---
- launchApp
- waitForVisibile:
    text: "Email"
- tapOn:
    text: "Email"
- inputText:
    text: "user@example.com"
- tapOn:
    text: "Password"
- inputText:
    text: "secret123"
- tapOn:
    id: "loginButton"
- waitForVisibile:
    text: "Welcome back!"
- assertVisible:
    text: "Welcome back!"

Detox:React Native的E2E测试

来自Wix的Detox通过与JS线程的自动同步确保测试的稳定性。测试不使用sleep——Detox在检查之前等待所有异步操作完成。

js
describe('Login flow', () => {
    beforeEach(async () => {
        await device.reloadReactNative()
    })

    it('should login successfully', async () => {
        await expect(element(by.id('emailInput'))).toBeVisible()
        await element(by.id('emailInput')).typeText('user@example.com')
        await element(by.id('passwordInput')).typeText('secret123')
        await element(by.id('loginButton')).tap()
        await expect(element(by.text('欢迎回来!'))).toBeVisible()
    })
})

CI/CD流水线中的E2E测试

将E2E测试集成到CI/CD是其有效性的关键因素。推荐策略——双层流水线:每个pull request运行由3-5个关键E2E场景组成的最小冒烟套件,完整回归套件在夜间(nightly build)或发布前运行。这种方法平衡了反馈速度和检查深度。

在CI中,E2E测试有三个关键方面:并行化——通过Firebase Test Lab或AWS Device Farm同时在多台设备上运行测试,将执行时间从几小时缩短到几分钟;环境容器化——使用Docker为后端和测试服务器提供可重现性;报告和重试——自动重启失败的测试(最多2次尝试)并生成包含每个场景通过视频的HTML报告。

根据Google Testing Blog (2022),使用专用E2E-CI流水线并行运行的团队将回归检测时间减少了60%。E2E测试有效性的关键指标不是测试数量,而是无假性失败的CI运行成功率。目标指标——E2E套件稳定性高于95%,完整覆盖关键路径。

常见问题

移动应用程序需要多少E2E测试?

对于中等规模的应用程序,15-25个覆盖关键用户场景的E2E测试就足够了。最佳数量由测试金字塔确定:E2E测试占总测试套件的5-10%。将E2E测试比例提高到10%以上会导致执行时间和维护成本不成比例地增长。

如何处理E2E测试的flakiness?

使用自动重试(2-3次尝试),通过Docker隔离测试环境,在模拟器上禁用动画,并使用waitForVisible代替固定暂停。Detox和Maestro等工具具有内置同步功能,与Appium相比显著降低了flakiness。

E2E测试是否需要真实的后端?

E2E测试的理想环境——与生产环境相同的staging服务器,带有测试数据。如果staging不可用,请使用Docker中的容器化后端。不能将真实的生产服务器用于E2E测试——测试会创建不一致的数据并影响真实用户。

可以用Swift或Kotlin编写E2E测试吗?

可以,对于原生E2E测试,iOS使用XCUITest(Swift),Android使用带有AndroidX Test的Espresso(Kotlin)。这些框架提供更好的性能,但不支持跨平台。Appium和Maestro仍然是需要一种语言同时支持两个平台的团队的选择。

E2E测试需要多久更新一次?

E2E测试在每次用户场景更改时更新:在流程中添加新屏幕、更改UI元素或导航逻辑。建议每个sprint进行一次测试套件审计,删除过时的场景并添加新的场景,以便套件反映应用程序的当前状态。

总结

  • E2E测试通过应用程序的所有层检查完整的用户场景,提供对系统正确性的最高信心。
  • 关键场景需要E2E覆盖——注册、支付、密码恢复和设备间的数据同步。
  • Detox和Maestro——具有自动同步功能的现代工具,可降低测试的flakiness。
  • CI/CD策略:每个pull request的冒烟套件,完整回归运行——夜间或发布前。
  • 目标稳定性E2E套件——在多台设备上并行运行时高于95%。
  • 测试金字塔将总覆盖的5-10%分配给E2E测试,侧重于关键用户路径。
  • 后端容器化和专用的staging服务器确保E2E运行的可重现性和可靠性。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读