(Angularjs)Web应用程序的集成testing

我正在开发一个Web应用程序。 它由2部分组成。 一个节点rest服务器和一个angularjs客户端。

该应用程序的结构如下:Rest Server < – > Api Module < – > Angular App

服务器目前正在testing中。 我有unit testing和集成testing。 集成testing正在访问一个真实的数据库,并通过http调用其余的api。 我认为这是服务器testing所能达到的最高水平。 集成testing也运行得很快。 我非常有信心,我testing服务器的方式足以满足我的使用情况,我对结果感到满意。

不过,我正在努力如何testingangularjs应用程序。 我有相关指令和模块的unit testing。 写这些不是一个问题。

我想编写涵盖用户场景的集成testing。 类似注册场景:用户访问网站,进入registry单,并提交表单与数据。

angularjs团队正在从ng场景转移到量angular器 。 量angular器使用Selenium来运行testing。 因此有两个范围:应用范围和testing范围。

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

  • 模拟Api模块
  • 嘲笑其余的服务器
  • 使用完整的服务器

模拟Api模块

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

优点:

  • 没有服务器是必要的

坏处:

  • API是在浏览器范围内,我不得不篡改这一点。

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

嘲笑其余的服务器

优点:

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

坏处:

  • 一个必须build立rest路线

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

然后我可以做像wasCalledOnce这样的断言

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

每个testing都运行一个完整的服务器,并可以添加元素到数据库中。 每次testing后,都可以查看数据库中预期的元素

优点:

  • 可以肯定的是,如果这些testing正在运行,应用程序在testing用例中起作用

坏处:

  • 我已经对其他服务器进行了相当强的集成testing。 这感觉就像再一次做同样的事情。
  • 安装取决于整个服务器

目前的结论

  • 嘲笑Api将完全分离服务器和客户端。
  • 使用模拟API将是一个更高级别的testing,但将需要一个假的服务器
  • 做一个完整的集成testing将提供最好的可靠性,但这也高度依赖于服务器代码

我应该select什么? 你会怎么做?

我想我在量angular器谷歌组中回答了同样的问题。 我和你想的不是一个服务器,而是想把我所有的testing代码放在一个地方(在量angular器中),而不是在量angular器和浏览器之间分开一样, 为了实现这个function,我亲自做了一件事,并开发了在量angular器内运行的$ httpBackend服务的代理。 它允许configuration$ httpBackend服务,就好像它在量angular器中运行一样。 我已经有一段时间了,现在已经有了相当完整的function。 如果你能够看一看,并且让我知道我是否缺less重要的东西,那将是非常好的。

https://github.com/kbaltrinic/http-backend-proxy

这是一个为您的Angular代码编写集成testing的方法。 关键的概念是以一种方式来构build你的代码,让你以一种非常类似于UI使用的方式调用各种函数。 恰当地解耦你的代码对于这个成功很重要,

更多这里: http : //www.syntaxsuccess.com/viewarticle/angular-integration-tests

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

这里有一个词汇的问题:“模拟”这个词在任何地方都被使用,你所说的“集成testing”更多的是“全面的端到端的自动functiontesting”。 这里没有冒犯,这只是一个明确的措辞将有助于解决这个问题。

你其实自己提出了正确的答案:#2存根其余的服务器。 #1是有用的,但很快就会很难开发和维护,#3是一个很好的主意,但与UItesting和UIvalidation无关。

为了实现前端的高可靠性,独立于后端,只需要对剩余的服务器进行存根,即开发一个愚蠢的简单的REST服务器,它将是幂等的,也就是总是对一个http请求回答相同的问题。 保持贱民的原则将使发展和testing,比任何其他选项,非常非常容易。

然后进行一次testing,只检查屏幕上显示的内容(testing顶部)以及发送到服务器的内容(testing底部),以便完整的UI堆栈仅testing一次。

这个问题的完整答案应该得到一个完整的博客文章,但是我希望你能从我的build议中感觉到该做什么。

最好的祝福

这是一个很好的问题。 这是我将如何做到这一点:

由于您已经对相关指令和模块进行了angular度单位testing,所以这是完美的。

另外一件很完美的事情就是你的服务器集成testing正在访问一个真实的数据库,并且也确保了其他的API可以运行。

那么为什么不只是同时添加一些包含angular和你的服务器的高级集成testing。

如果可以避免嘲笑,为什么不保存工作以保持额外的代码,如果可能的话。

另外一个很好的阅读: http : //blog.ericbmerritt.com/2014/03/25/mocking-is-evil.html

在我看来,嘲笑REST服务器是最好的,更干净的select。 尝试Mountebank( http://www.mbtest.org )。 一个了不起的虚拟化服务工具。