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