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

Javascript 如何对(Angularjs)Web应用程序进行集成测试,javascript,node.js,angularjs,testing,protractor,Javascript,Node.js,Angularjs,Testing,Protractor,我正在开发一个网络应用程序。 它由两部分组成。一个节点rest服务器和一个angularjs客户端 应用程序的结构如下:Rest服务器Api模块应用程序 服务器目前已经过良好的测试。 我有单元测试和集成测试。 集成测试是访问真实数据库并通过http调用RESTAPI。 我认为这是服务器测试所能达到的最高水平。 集成测试也运行得很快。 我非常自信,我测试服务器的方式足以满足我的用例,我对结果感到满意 然而,我正在努力测试angularjs应用程序。 我有相关指令和模块的单元测试。写这些不是问题 我

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

应用程序的结构如下:Rest服务器Api模块应用程序

服务器目前已经过良好的测试。 我有单元测试和集成测试。 集成测试是访问真实数据库并通过http调用RESTAPI。 我认为这是服务器测试所能达到的最高水平。 集成测试也运行得很快。 我非常自信,我测试服务器的方式足以满足我的用例,我对结果感到满意

然而,我正在努力测试angularjs应用程序。 我有相关指令和模块的单元测试。写这些不是问题

我想编写涵盖用户场景的集成测试。 类似于注册场景:用户访问网站,转到注册表单,然后提交表单和数据

angularjs团队正在从一个移动到另一个。 量角器正在使用Selenium运行测试。 因此有两个范围:应用程序范围和测试范围

现在我可以想出三种不同的抽象方法。 我不确定哪一个最适合我

  • 模拟Api模块
  • 模拟Rest服务器
  • 使用完整的服务器
模拟Api模块 在这种情况下,我不需要设置服务器。所有交互都在浏览器中运行

优点:

  • 不需要服务器
缺点:

  • api在浏览器范围内,我必须对此进行修改
我真的很喜欢这个解决方案,但我发现很难模仿Api。 需要在浏览器范围内修改Api。 因此,我需要将修改从测试发送到浏览器。 但是,我不知道如何在tests范围内运行像
mockedApi.method.wasCalledOnce()这样的断言

模拟Rest服务器 优点:

  • 客户将保持不变
  • 只有一个范围需要处理
缺点:

  • 必须设置休息路线
我可以在nodejs中创建一个完整的模拟Rest服务器。 量角器测试是用nodejs编写的,因此可以在测试中控制服务器。 在运行测试之前,我可以告诉服务器如何响应。 类似这样的内容:
server.onRequest({method:'GET',url:'/'})。respondWith('hello world')

然后我可以做一些断言,比如
wasCalledOnce

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

优点:

  • 可以非常肯定的是,如果这些测试正在运行,那么该应用程序在测试用例中是功能性的
缺点:

  • 我已经与rest服务器进行了相当密集的集成测试。这感觉就像再次做同样的事情
  • 安装程序取决于完整的服务器
当前结论
  • 模拟Api将使服务器和客户端完全分离
  • 使用模拟Api将是更高级别的测试,但需要一个假服务器
  • 进行完全集成测试将提供最佳的可靠性,但这也高度依赖于服务器代码

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

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

这里有一个词汇问题:“mock”一词随处可见,而您所谓的“集成测试”更多的是“完整的端到端自动化功能测试”。这里没有冒犯的意思,只是清楚的措辞有助于解决问题

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

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

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

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


致以最良好的祝愿

我想我在Grandor google小组回答了同样的问题。我和你的想法大致相同,我不想要服务器,但希望我的所有测试代码都放在一个地方(在量角器中),而不是在量角器和浏览器之间分割。为了实现这一点,我亲自动手,为$httpBackend服务开发了一个代理,该服务在Gragrator中运行。它允许配置$httpBackend服务,就像它在量角器中运行一样。我已经做了一段时间了,现在它的功能相当全面。如果你能看一看,让我知道我错过了什么重要的东西,那就太好了


这是一个很好的问题。我会这样做:

由于您已经对相关指令和模块进行了角度单元测试,因此这是完美的

另一件完美的事情是,您的服务器集成测试正在访问一个真实的数据库,并且还确保http上的RESTAPI工作正常

那么,为什么不添加一些同时包括angular和您的服务器的高级集成测试呢

如果可以避免模拟,那么如果可能的话,为什么不保存工作来维护额外的代码呢

这也是一本好书:

<