我正在开发一个 Web 应用程序。它由 2 个部分组成。一个节点休息服务器和一个 angularjs 客户端。
该应用程序的结构如下:Rest Server <--> Api Module <--> Angular App
该服务器目前经过良好测试。我有单元测试和集成测试。集成测试正在访问一个真实的数据库并通过 http 调用其余的 api。我认为这是服务器测试所能达到的最高水平。集成测试也运行得很快。我非常有信心测试服务器的方式足以满足我的用例,并且我对结果感到满意。
但是我正在努力如何测试 angularjs 应用程序。我对相关指令和模块进行了单元测试。写这些不是问题。
我想编写涵盖用户场景的集成测试。类似于注册场景:用户访问网站,进入注册表单,并提交包含数据的表单。
angularjs 团队正在从ng-scenarios转移到protractor。Protractor 正在使用 Selenium 运行测试。因此有两个范围:应用范围和测试范围。
现在我可以想到我可以使用的三种不同的抽象。而且我不确定哪一个最适合我。
- 模拟 Api 模块
- 模拟其余服务器
- 使用完整的服务器
模拟 Api 模块
在这种情况下,我不需要设置服务器。所有交互都在浏览器中运行
优势:
- 不需要服务器
坏处:
- 该 api 在浏览器范围内,我必须篡改它。
我真的很喜欢这个解决方案,但我发现很难模拟 Api。需要在浏览器范围内修改 Api。因此我需要将修改从测试发送到浏览器。这可以做到,但是我看不到如何mockedApi.method.wasCalledOnce()
在测试范围内运行断言
模拟其余服务器
优势:
- 客户将保持不变
- 只需处理一个范围
坏处:
- 必须设置休息路线
我可以在 nodejs 中创建一个完整的模拟休息服务器。量角器测试是用nodejs编写的,因此可以在测试中完成对服务器的控制。在我运行测试之前,我可以告诉服务器如何响应。像这样的东西:server.onRequest({method: 'GET', url: '/'}).respondWith('hello world')
然后我可以做这样的断言wasCalledOnce
将完整的服务器与数据库一起使用
每个测试都使用完整的服务器运行,并且可以将元素添加到数据库中。每次测试后,可以查看数据库中的预期元素
优势:
- 可以肯定的是,如果这些测试正在运行,则应用程序在测试用例中可以正常运行
坏处:
- 我已经与其余服务器进行了相当激烈的集成测试。这感觉就像再次做同样的事情。
- 设置取决于完整的服务器
目前的结论
- 模拟 Api 将完全分离服务器和客户端。
- 使用 Mock Api 将是更高级别的测试,但需要假服务器
- 做一个完整的集成测试会提供最好的可靠性,但这也高度依赖于服务器代码
我应该选择什么?你会怎么做?