(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重要的东西,那将是非常好的。
这是一个为您的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 )。 一个了不起的虚拟化服务工具。