angularjs - 在 Angular 中测试 e2e,最佳实践

标签 angularjs protractor angularjs-e2e

这个问题可能已经有了一些答案,但我还没有找到我正在寻找我的特定场景的答案。所以,这是我的情况:我正在开发一个用 Angular 制作的网络应用程序,其中所有单元测试都使用模拟数据。然后我们有一些用 Protractor 编写的端到端测试。我对它们不是很兴奋,因为我们正在使用从实时 api 获得的数据测试用户界面。我认为我们使用这种方法是因为我们无法控制后端,但这样做的副作用是数据库可能会改变我们的测试。此外,我们用于 e2e 的 api 是在内部网络上运行的,这意味着我们无法在办公室外运行测试。我正在考虑模拟 http 响应以模拟数据库并能够从任何地方运行所有测试。问题在于后端逻辑的行为可能与我们在测试中模拟的不同,这意味着一旦我们部署了应用程序,它就会以一种意想不到的方式工作。

在类似情况下应遵循的最佳实践和工作流程是什么?

最佳答案

最佳实践是主观的,但已知的解决方案各有利弊。

使用共享环境
如果您在与自动化测试相同的环境中进行手动测试,那么您将面临有人搞砸您的测试的风险。将数据从生产复制到此环境也会停止您的测试,这并不好。通过确保设置处于测试预期的正确状态以及确保数据设置与手动测试不冲突,需要额外的努力来使您的测试具有幂等性。建议在测试设置期间创建实体时,使用与测试相关的一些唯一 token 创建它,以便它对该测试是唯一的。这既困难又昂贵。

使用单独的 e2e 环境
这显然更容易测试幂等性,因为您可以更好地控制数据并且无需人工干预。您可以在每次测试或测试组之前清空数据库或使用多种解决方案(见下文)重新设定数据库。您仍然必须小心确保测试不相互依赖或干扰其他测试。

模拟 API
您可以模拟 API,但这不是真正的 e2e 测试。如果您知道 API 正在针对特定输出进行测试,那么消费者驱动的合约将起作用,然后您可以将这些输出用作 e2e 输入的模拟。这些测试非常快。如果您无法控制环境及其数据,或者它是第 3 方系统,则建议模拟 api。你冒着没有测试真正的集成的风险,这可能会导致很多失败。

使用 API 设置测试数据
这是一个非常好的解决方案,因为它不仅可以捕获 API 的问题,而且可以让您的 e2e 测试只关注被测试的区域,而您不必使用 GUI 设置数据。可以通过这种方式管理测试设置和清理。它可能比使用 GUI 设置更快,当然不会比模拟 API 响应更快。

使用 GUI 设置测试数据
这可以工作,但你必须聪明。由于您通过手动测试共享环境,因此您必须确保数据处于正确状态。明智的做法是创建与您的测试相关的单独实体,并且不要共享任何有人会手动测试的测试用例。这个比较慢。这会使您的测试复杂化,因为您花费了大部分时间在 GUI 中浏览和设置内容。

使用脚本将数据直接加载到数据库
避免这种情况,因为您可能缺少业务逻辑并且会导致不正确的状态。最好通过 API 加载数据,因为它可以验证输入并运行任何业务逻辑。

以下是一些需要跟进的相关资源:

  • Martin Fowler's write-up on testing microservices
  • https://medium.com/how-we-build-fedora/e2e-testing-with-angular-protractor-and-rails-725fbefb8149#.9rziv2gtp
  • 关于angularjs - 在 Angular 中测试 e2e,最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35286769/

    相关文章:

    angularjs - Protractor :异步超时,我认为是因为它找不到元素

    angularjs - 有效识别元素 - AngularJS Automation with Ranorex

    javascript - 无法让孙子状态与 UI 路由器一起工作

    selenium - 在 Protractor 中选择第一个可见元素

    javascript - 将 Protractor 测试脚本和依赖项打包到一个文件中

    node.js - 如何在 Protractor 中为不同规范文件制作单独的报告?

    angularjs - 如何在 Protractor 中模拟拖放 Action ?

    javascript - 在非 Angular 应用中使用 Protractor 有什么好处?

    php - htaccess 在 php 和 angularjs 中配置路由

    javascript - AngularJS - 为什么我的复选框不与我的 ng-model 属性保持状态?