如何对(Angularjs)Web应用程序进行集成测试
How to do Integration Testing for (Angularjs) Web Apps
我正在开发一个Webapp。它由两部分组成。一个节点休息服务器和一个 angularjs 客户端。
该应用程序的结构是这样的:Rest Server <--> API Module <--> Angular App
服务器目前经过良好测试。我有单元测试和集成测试。集成测试正在访问一个真实的数据库,并通过http调用其余的api。我认为这是服务器测试所能达到的最高水平。集成测试运行速度也很快。我非常有信心,我测试服务器的方式足以满足我的用例,我对结果感到满意。
但是,我正在努力测试angularjs应用程序。我有相关指令和模块的单元测试。写这些不是问题。
我想编写涵盖用户方案的集成测试。类似于注册方案:用户访问网站,转到注册表单,然后提交包含数据的表单。
angularjs团队正在从ng场景转向量角器。量角器正在使用硒来运行测试。因此,有两个范围:应用范围和测试范围。
现在我可以想到三种不同的抽象,我可以使用。而且我不确定哪一个最适合我。
- 模拟 API 模块
- 模拟其余服务器
- 使用完整服务器
模拟 API 模块
在这种情况下,我不需要设置服务器。所有交互都在浏览器中运行
优势:
- 无需服务器
缺点:
- 该 api 在浏览器范围内,我必须篡改它。
我真的很喜欢这个解决方案,但我发现很难嘲笑 API。需要在浏览器范围内修改 API。因此,我需要将修改从测试发送到浏览器。这是可以做到的,但是我不明白如何在测试范围内运行像mockedApi.method.wasCalledOnce()
这样的断言
模拟其余服务器
优势:
- 客户端将保持不变
- 只有一个范围需要处理
缺点:
- 必须设置休息路线
我可以在nodejs中创建一个完整的模拟休息服务器。量角器测试是用nodejs编写的,因此可以在测试中完成对服务器的控制。在运行测试之前,我可以告诉服务器如何响应。像这样的东西:server.onRequest({method: 'GET', url: '/'}).respondWith('hello world')
然后我可以做这样的断言wasCalledOnce
将完整服务器与数据库一起使用
每个测试都使用完整的服务器运行,并且可以向数据库添加元素。每次测试后,可以查看数据库中的预期元素
优势:
- 可以非常肯定,如果这些测试正在运行,该应用程序在测试用例中正常运行
缺点:
- 我已经对其余服务器进行了相当激烈的集成测试。这感觉就像再次做同样的事情。
- 设置取决于整个服务器
当前结论
- 模拟 API 会将服务器和客户端完全分开。
- 使用模拟 API 将是一个更高级别的测试,但需要一个假服务器
- 进行完全集成测试将提供最佳的可靠性,但这也高度依赖于服务器代码
我应该选择什么?你会怎么做?
我在量角器谷歌组中回答了同样的问题。 我和你的想法大致相同,不想要服务器,但希望我所有的测试代码都集中在一个地方(在量角器中(,而不是在量角器和浏览器之间拆分。 为了实现这一点,我自己动手,为量角器中运行的$httpBackend服务开发了一个代理。 它允许人们配置$httpBackend服务,就好像它在量角器中运行一样。 我已经为它工作了一段时间,在这一点上它的功能相当齐全。 如果您能看一看,如果我错过了什么重要的东西,那就太好了。
https://github.com/kbaltrinic/http-backend-proxy
这是一个很好的问题,与特定工具无关。我不得不在一个大型"绿地"(即从头开始(项目中面对同样的问题。
这里有一个词汇问题:"mock"这个词到处都是,你所说的"集成测试"更多的是"完整的端到端自动化功能测试"。这里没有冒犯,只是明确的措辞将有助于解决问题。
您实际上自己提出了正确答案:#2 存根其余服务器。 #1 是可行的,但很快就会很难开发和维护,#3 是一个很好的主意,但与 UI 测试和 UI 验证无关。
为了实现前端的高可靠性,独立于后端,只需存根其余服务器,即开发一个愚蠢的简单 REST 服务器,它将幂等,即总是对一个 http 请求回答同样的事情。保持幂等原则将使开发和测试比任何其他选项都非常非常容易。
然后,对于一个测试,您只需检查屏幕上显示的内容(测试顶部(和发送到服务器的内容(测试底部(,以便仅测试一次完整的 UI 堆栈。
这个问题的完整答案应该值得写一整篇博客文章,但我希望你能从我的建议中感受到该怎么做。
此致敬意
这是一种为 Angular 代码编写集成测试的方法。关键概念是以一种允许你以与 UI 使用的方式非常相似的方式来调用各种函数的方式构建代码。不过,正确解耦代码对于成功做到这一点很重要:
更多在这里: http://www.syntaxsuccess.com/viewarticle/angular-integration-tests
这是一个很好的问题。这就是我会这样做的:
由于您已经拥有相关指令和模块的角度单元测试,因此这是完美的。
另一件完美的事情是,您的服务器集成测试正在访问一个真实的数据库,并且还确保其余的 api 通过 http 工作。
那么,为什么不添加一些高级集成测试,同时包括angular和您的服务器。
如果你可以避免嘲笑,为什么不保存工作来维护额外的代码,如果可能的话。
也是一个很好的阅读:http://blog.ericbmerritt.com/2014/03/25/mocking-is-evil.html
在我看来,模拟 REST 服务器是最好、更干净的选择。试试蒙特班克(http://www.mbtest.org(。一个了不起的虚拟化服务工具。
- 如何将tesseract OCR与Cordova/Phonegap应用程序集成
- 如何在rails应用程序中测试AJAX加载的内容
- 如何将现有的angular js应用程序集成到Laravel 5中
- 如何将ember应用程序集成到json服务器中使用
- IBM Filenet如何与Angular应用程序集成
- 将Google Places API与Rails应用程序集成
- 如何将Angular 2应用程序集成到Django应用程序中
- 将登录验证模块与现有的Angular JS应用程序集成
- 用于以用户体验为中心的web应用程序回归测试的工具和技术
- 如何使用具有多个入口点的 Webpack 和 Gulp 来转译应用程序和测试目录
- 将大气层上的中等编辑器与望远镜应用程序集成
- 将 Outlook 与 JS Web 应用程序集成
- 将Javascript函数与Grails应用程序集成
- 如何将Crashlytics与React Native应用程序集成
- 使用Mocha和Superagent在裸Node.js应用程序中测试帖子
- 是否有可能/可行将非microsoft REST客户端应用程序集成到Sharepoint 2013 OAuth中以获取R
- 将支付网关与angularjs应用程序集成到spring后端
- 我应该如何在我的应用程序集成谷歌地图
- 初学者问题:如何将processing.js与Rails 3.1应用程序集成
- Facebook, Twitter与Phonegap应用程序集成,无需使用插件