AngularJS测试:在Yeoman应用中使用Protractor、Karma和Jasmine

19

我使用这个 yeoman 生成器: https://github.com/Swiip/generator-gulp-angular

它安装了三个测试应用:Jasmine、Karma 和 Protractor。根据这篇文章 (Should I be using Protractor or Karma for my end-to-end testing?),如果我要对某个单一控制器进行小规模测试,则应该使用 Karma。如果我想要测试整个应用程序并模拟用户浏览我的应用程序,则应该使用 Protactor。根据这篇博客 (http://andyshora.com/unit-testing-best-practices-angularjs.html),我会使用 Jasmine 进行单元测试和 Karma 进行端到端集成测试。

我猜测 Jasmine 是编写测试的语言,另外两个是执行代码的工具,这是正确的吗?如果我从未编写过测试,那么学习哪个更重要/应该关注哪个?


请查看我的答案,了解Karma和Protractor的用例、优点和限制的更详细讨论:https://dev59.com/zGQn5IYBdhLWcg3wIkMF#29619467 - Dmitri Zaitsev
1个回答

46

Karma是一个测试运行程序,它可以运行你的测试。Jasmine则是让你编写测试的框架。

在我看来,在Angularjs中:

  • 必须对服务进行单元测试,因为你的业务代码就在那里。
  • 应该对控制器进行单元测试,因为用户操作也在那里。
  • 可以对自定义指令进行单元测试(如果你计划与他人共享该指令,则必须进行测试)。

Protractor是专门用于端到端测试(模拟用户的导航操作)的工具。它将WebDriverJS与Jasmine结合起来,以Jasmine语法编写端到端测试(模拟真实浏览器并执行真实操作)。

这种类型的测试在Web应用程序中也非常重要。

你不应该测试所有东西,特别是在项目开始时,这些测试通常需要高水平的维护(例如,当你更改屏幕时,你可能需要更改测试)。

我的做法是测试关键路径和功能。我做了一个阅读应用程序,所以在我的情况下,关键路径和功能包括登录、注册、付款、访问图书和访问阅读器。


好的,但是我可以用Protractor做什么呢?它也是一个测试运行器吗?我在那里也要用jasmine写代码吗? - Andi Giga
啊,好的,那怎么测试支付呢?因为提供商有交易费用。有没有便宜的隐藏产品可以节省费用之类的?所以我想我应该先学习Jasmine(就像我发布的博客文章一样),而且测试套件可能无论如何都由gulp控制。有没有好的资源可以学习Jasmine,否则我就自己在谷歌上搜索了? - Andi Giga
付款时,我只检查屏幕访问和重定向,而不是实际付款。Jasmine有一些文档http://jasmine.github.io/2.0/introduction.html,但它更多的是为了在需要时去挑选你需要的内容。我最常用的是spyOn,expect,toBe,toEqual,toHaveBeenCalled,以及特定于angularjs的$httpBackend用于网络调用存根。 - Boris Charpentier
当你在测试中(即加载angularMock)时,你应该知道你必须手动解决承诺,调用$scope.$digest()和$httpBackend.flush()进行网络调用。原则是Angular团队不喜欢异步测试,因此测试中的行为是同步的。我认为这很棒 :) - Boris Charpentier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接