我正在开发一个 Webapp。 它由两部分组成。一个 node rest 服务器和一个 angularjs 客户端。
应用程序的结构如下:Rest 服务器 <--> Api 模块 <--> Angular 应用程序
目前,该服务器经过了充分的测试。 我有单元测试和集成测试。 集成测试访问真实数据库并通过 http 调用 rest api。 我认为这是服务器测试的最高级别。 集成测试也运行速度快。 我相当自信地认为,我测试服务器的方式足以满足我的用例,并且我对结果感到满意。
然而,我不知道如何测试 angularjs 应用程序。 我为相关指令和模块编写了单元测试。编写这些测试并不是问题。
我想编写涵盖用户场景的集成测试。 例如注册场景:用户访问网站,转到注册表单,并提交数据。
angularjs 团队正在从 ng-scenarios 切换到 protractor。 Protractor 使用 Selenium 运行测试。 因此,有两个范围:应用程序范围和测试范围。
现在我可以想出三种不同的抽象方法。 我不确定哪种最适合我。
- 模拟 Api 模块
- 模拟 Rest 服务器
- 使用完整的服务器
模拟 Api 模块
在这种情况下,我不需要设置一个服务器。所有互动都在浏览器中运行。
优点:
- 不需要服务器
缺点:
- Api 在浏览器范围内,我必须干预它。
我真的很喜欢这个解决方案,但是我发现很难模拟 Api。 Api 需要在浏览器范围内进行修改。 因此,我需要将修改从测试发送到浏览器。
这是可以做到的,然而我不知道如何在测试范围内运行像mockedApi.method.wasCalledOnce()
这样的断言。
模拟REST服务器
优点:
- 客户端不需要更改
- 只需处理一个作用域
缺点:
- 必须设置REST路由
我可以在nodejs中创建完整的Mock Rest Server。
Protractor Tests是用nodejs编写的,因此可以在测试中控制服务器。
在运行测试之前,我可以告诉服务器如何响应。
类似于这样:server.onRequest({method: 'GET', url: '/'}).respondWith('hello world')
然后我可以进行像wasCalledOnce
这样的断言。
使用完整的带有数据库的服务器
每个测试都在完整的服务器上运行,并且可以向数据库中添加元素。 在每个测试之后,可以查看数据库中的预期元素。
优点:
- 如果这些测试正在运行,则可以相当确定该应用在测试的用例中是功能性的
缺点:
- 我已经使用rest server完成了相当强烈的集成测试。这感觉像是再做一次。
- 设置取决于完整的服务器
当前结论
- 模拟Api将完全分离服务器和客户端。
- 使用Mock Api将是更高级别的测试,但需要一个虚假服务器
- 进行完整的集成测试将提供最佳可靠性,但这也高度依赖于服务器代码
我该选择什么?你会选择什么?