2012-11-02 49 views
15

我们刚刚开始使用AngularJS开发Web应用程序,我们在正确测试时遇到了一些问题,因此我们可以使用一些建议。

一般来说,有以下组件来测试:

  1. 的Web API
  2. 角控制器
  3. 角路由
  4. HTML渲染和角控制器的结合HTML元素

如何以最小的努力测试所有这些,如果可能的话,不会重叠?

对于任何以数据库为中心的应用程序来说,完整的集成测试(例如,连接到加载数据的数据库的活动服务器)将特别混乱,因为必须有一个过程为所有测试和重置生成足够的数据数据库和测试必须小心,不要修改彼此的数据。 (如果我在这里丢失东西请让我知道)

鉴于上述观点,我假设最好断开服务器和客户端之间的链接,并仅使用模拟数据运行Angular测试。另外,假设如果E2E测试处理所有可能的情况,单元测试控制器是多余的,因为它们的值绑定到模型(并且因此将测试上面的2,3和4中的全部)。单元测试只会对非常复杂的控制器或测试服务和指令有帮助。

但是,我们无法找到任何关于如何在每个测试基础上模拟$httpBackend的信息,就像您在单元测试中使用expect*()一样。 Angular docs似乎建议在必要时使用when*()加上偶尔的passthrough()

但是,这提出了为所有场景创建测试数据的上述问题,您可能需要在每次测试之前重置内存数据库,以确保测试不受影响。此外,您正在失去使用$httpBackEnd.expect*()的安全性,这会检查服务器是否存在缺少或多余的呼叫 - 这对我而言意味着它还需要单元测试控制器来检查这一点。

有人可以为AngularJS应用程序提供详细的测试策略,解决上述4个组件的测试以及上面写的问题吗?

+0

我还在脑海里想着这些不同的想法。我认为最重要的是在真实的数据库上测试完整的应用程序。这也是最难的。使用角度场景这个看起来有点不对,因为那样你就可以将自己锁定在Angular中进行所有测试。像Selenium WebDriver这样的东西似乎更好,但它也是一个麻烦设置。如果我找到一个明确的策略,我会回到这个。 – iwein

+0

绝对如此。对真实数据库有很多价值测试。 +1选择Angular生态系统之外的东西,尽管没有天生适合引入Selenium。您可以自由选择任何硒实现,例如Python或C#或Java。 – fatuhoku

回答

6
  1. 不知道 - 因为你的角度应用程序是从理论上后端分离,没有特别的原因,角度测试和后端测试需要混合。我会单独测试它们,每个测试套件都假设其他组件工作正常。 (因此,在测试角度时,假定服务器将按预期工作。)

  2. 单元测试 - 它们比E2E测试提供更多深度。验证代码将面对的特定条件更容易。根据需要嘲笑所有依赖关系也很容易,并且只测试单元测试感兴趣的组件。单元测试不关心UI如何工作,或者正确绑定了正确的数据,而不是关注业务逻辑的应用程序是正确的。(和4)E2E测试 - 较小的粒度,侧重于确保UI从最终用户的角度看起来像预期的那样。你说的对一个实时数据库进行测试很麻烦(尽管有些人喜欢全面的端到端集成测试提供的安全性),所以你应该使用$httpBackend来嘲笑服务器。