如何为(Angularjs)Web应用程序进行集成测试

30 javascript testing node.js angularjs protractor

我正在开发一个Webapp.它由两部分组成.节点休息服务器和angularjs客户端.

该应用程序采用以下方式构建:Rest服务器< - > Api模块< - > Angular App

该服务器目前已经过充分测试.我有单元测试和集成测试.集成测试正在访问一个真实的数据库并通过http调用其余的api.我认为这与服务器测试一样高.集成测试也运行得很快.我非常有信心我测试服务器的方式足以满足我的用例,我对结果感到满意.

然而,我正在努力如何测试angularjs应用程序.我对相关指令和模块进行了单元测试.写这些不是问题.

我想编写涵盖用户场景的集成测试.像注册场景:用户访问网站,转到注册表单,并提交带有数据的表单.

angularjs团队正在从ng场景转变为量角器.量角器正在使用Selenium来运行测试.因此,有两个范围:应用范围和测试范围.

现在我可以想到我可以使用的三种不同的抽象.而且我不确定哪一套最适合我.

  • 模拟Api模块
  • 模拟Rest服务器
  • 使用完整的服务器

模拟Api模块

在这种情况下,我不需要设置服务器.所有交互都在浏览器中运行

优点:

  • 不需要服务器

坏处:

  • api在浏览器范围内,我不得不篡改它.

我真的很喜欢这个解决方案,但我觉得很难嘲笑Api.需要在浏览器范围内修改Api.因此,我需要将测试中的修改发送到浏览器.这可以做到,但是我没有看到如何mockedApi.method.wasCalledOnce()在测试范围中运行断言

模拟Rest服务器

优点:

  • 客户将保持不变
  • 只有一个范围可以处理

坏处:

  • 一个人必须设置休息路线

我可以在nodejs中创建一个完整的Mock Rest服务器.量角器测试用nodejs编写,因此可以在测试中完成对服务器的控制.在我运行测试之前,我可以告诉服务器如何响应.像这样的东西:server.onRequest({method: 'GET', url: '/'}).respondWith('hello world')

然后我可以做断言 wasCalledOnce

使用完整的服务器与数据库

每个测试都使用完整的服务器运行,并且可以向数据库添加元素.在每次测试之后,可以查看数据库中的预期元素

优点:

  • 可以肯定的是,如果这些测试正在运行,那么应用程序在测试用例中是有用的

坏处:

  • 我已经与其他服务器进行了相当强烈的集成测试.这感觉就像再次做同样的事情.
  • 安装程序取决于整个服务器

目前的结论

  • 模拟Api会完全分离服务器和客户端.
  • 使用模拟Api将是一个更高级别的测试,但需要一个假的服务器
  • 执行完整集成测试将提供最佳可靠性,但这也高度依赖于服务器代码

我应该选择什么?你会怎么做?

bda*_*xyz 3

这是一个很好的问题,与特定工具无关。我不得不在一个大型“绿地”(即从头开始)项目中面临同样的问题。

这里有一个词汇问题:“模拟”这个词到处都在使用,而你所谓的“集成测试”更多的是“完整的端到端自动化功能测试”。这里没有冒犯的意思,只是表述清楚有助于解决问题。

您实际上自己提出了正确的答案:#2 存根其余服务器。#1 是可行的,但很快就会变得难以开发和维护,#3 是一个很好的想法,但与 UI 测试和 UI 验证无关。

为了实现前端的高可靠性,独立于后端,只需存根其余服务器,即开发一个愚蠢的简单 REST 服务器,它将是幂等的,即始终对一个 http 请求回答相同的事情。保持幂等性原则将使开发和测试比任何其他选项都非常非常容易。

然后,对于一个测试,您只需检查屏幕上显示的内容(测试顶部)和发送到服务器的内容(测试底部),以便完整的 UI 堆栈仅测试一次。

这个问题的完整答案值得写一篇完整的博客文章,但我希望您能从我的建议中感受到该怎么做。

此致