如果Protractor正在替换Angular Scenario Runner进行E2E测试,这是否意味着我仍然可以将Karma用作我的E2E测试框架?
答案 0 :(得分:98)
目前的量角器维护者不推荐:
<强> https://github.com/angular/protractor/issues/9#issuecomment-19927049 强>
量角器和Karma不应该一起使用;相反,它们为运行测试提供单独的系统。量角器和Karma涵盖测试的不同方面 - Karma主要用于单元测试,而Protractor应用于端到端测试。
Protractor建立在WebDriverJS之上,它使用Selenium / WebDriver服务器来配置浏览器并推动测试执行。可以在此处找到纯WebDriverJS的示例:http://code.google.com/p/selenium/wiki/WebDriverJs
和
<强> https://github.com/angular/protractor/issues/9#issuecomment-19931154 强>
Georgios - 我认为保持Protractor和Karma分离是有意义的 - 对于端到端测试,您需要本机事件驱动和webdriver的灵活性,而对于单元测试,您需要快速执行和自动操作文件。
答案 1 :(得分:73)
更新。这是一个simple package I've created,可以使用一个命令npm install min-karma
为任何项目添加最小的Karma设置。
我想澄清一些关于 Karma 和量角器的误解。 Karma FAQ实际上确实引用了Adapter for Angular's Scenario Runner,然而,这似乎被放弃了,而建议使用量角器。
Karma是一个测试运行器,可以在you configuration file中明确地或使用node-globs运行指定的 JavaScript 文件 。 (对于非JavaScript 外部模板,Angular's Unit Testing Guide建议先使用Karma html preprocessor将其编译为JavaScript。)
这些所有你的源文件,一些,其中一些加上一些其他文件或文件无关< / em>到你的项目,只提供一些额外的配置 - 你说出来! 您可以将多个karma配置文件用于不同目的,您可以并行或逐个运行。每个业力流程都会启动自己的一组浏览器(these are currently available)。
Karma 的功能只能运行文件集,这使得它非常适合在每个源文件的后台运行快速测试编辑,并获得即时反馈,这是辉煌的!唯一的负面影响是&#34;嘈杂&#34;错误报告,希望有所改善!
Unit test适用于您的源代码的单个单元。在Angular的情况下,典型的单位是角度分量(Service, Factory, Provider, Controller, Filter, Directive
等)。请记住保持Controllers
薄,因此过多的单元测试是红旗。
在单元测试中,不应同时测试此单元所依赖的每个其他代码单元(所谓的单元依赖性)。相反,他们应该被嘲笑&#34;,例如取而代之的是简单的虚拟实例。 Angular提供great mock environment support。理想情况下,您希望直接在测试中看到所有这些模拟,因此您永远不需要知道所有这些依赖项的来源。
Karma 对Integration Tests同样有用,其中源代码单元组一起进行测试,只有部分依赖项< / em>被嘲笑。重要的是要记住,默认情况下,您的源代码模块提供任何依赖项(只要这些模块injected directly in your tests,或者它们是注入的其他模块的依赖项(在这种情况下,您不需要注入它们,但没有坏处。)模拟的依赖项将覆盖提供的依赖项。
快速而频繁是 Karma 的主要特征。这意味着您希望避免任何服务器请求,任何数据库查询,任何可能需要超过几秒的事情。 (否则它不会很快!)那些漫长的进程就是你想要 mock 的进程。这也解释了为什么将$http
等原始低级服务直接放在控制器或任何复杂的业务逻辑单元中是不好的做法。通过将那些低级别的外部通信服务包装到较小的专用服务中,您可以更容易地将它们嘲笑掉#34;。
什么 Karma 不执行正在按原样运行您的网站,这是端到端(E2E)测试的结果。原则上,您可以使用Angular的内部方法来重新创建站点或其部分。对于小件,它可以是有用的,并且是快速的方式,例如测试指令。
然而,不建议使用方法在测试中输入复杂的代码。您执行的操作越多,您在代码中而不是实际测试的错误的可能性就越大。
这就是为什么我个人不喜欢使用低级方法(如$http
)经常提到的测试方法的复杂方法。它可以更清晰地将对低级方法的任何引用隔离到您自己的专用方法中,其单一职责用于发出http请求。这些专用方法应该能够与真正的后端一起使用,而不是假的!您可以轻松测试 - 手动甚至完全正常使用 Karma 运行另一个特殊配置,只要您不将该配置与通常使用的配置混合使用定期快速运行 Karma 。
现在,通过测试您的专用小型服务,您可以安全轻松地模拟它们以测试您的其他逻辑并将这些测试放入常规 Karma 设置中。
总结。使用 Karma 运行任何JavaScript文件集。它应该(应该)快。您没有看到完整的应用,因此无法有效可靠地测试最终结果。我会用Protractor 运行吗?我为什么要?运行量角器会减慢我的测试速度,打败 Karma 的目的。分别运行量角器很容易。
AngularJS应用程序的端到端测试框架。 Protractor针对在真实浏览器中运行的应用程序运行测试,并以用户的身份与其进行交互。
所以量角器完全符合 Karma 没有 - 运行真正的最终应用程序。这揭示了它的力量和局限性:
运行完整的应用程序是您的应用程序按预期工作的唯一可靠的最终测试。您可以编写完整的用户故事情景并将其放入测试中!
但更难跟踪错误而不会隔离源代码的各个单元。这就是为什么你仍然需要 Karma 来首先测试你的JavaScript代码。
现在我想用 Karma 运行量角器吗?我当然可以在单独的终端窗口中并行运行它们。原则上,如果需要,我可以让他们共享测试文件,但通常我不愿意。为什么?因为我希望通过一个专门的目的来保持我的测试。
唯一的例外是文件定义测试宏对两个跑步者都有用。但是,这不是测试文件,而是宏定义文件。
除此之外,我喜欢我的测试之间的明确分离。那些经常和快速运行,以及完整的应用程序。这在使用 Karma 和量角器时明确区分。
答案 2 :(得分:1)
Karma是Angular团队提供的测试运行程序,Karma将在多个浏览器中执行您的测试,这将确保我们的应用程序与所有浏览器兼容。 用于角度js的单元测试可以使用业力+茉莉花
Jasmine是一个javascript单元测试框架,它将为我们提供实用程序来测试我们的应用程序。这在Angular框架上效果最好,因此,我们选择了“自动化单元测试工具”。 https://github.com/shahing/testingangularjs
并且Protractor是Angular和AngularJS应用程序的端到端测试框架。 量角器针对在真实浏览器,无头浏览器,跨浏览器测试中运行的应用程序运行测试,并且可以托管在saucelabs中。
答案 3 :(得分:1)
是的,您可以同时使用业力和量角器。业力用于对使用angular命令创建的组件进行单元测试,您可以使用业力来测试那些组件。 量角器用于端到端测试。主要用于UI测试。