Protractor和Karma可以一起使用吗?

105

如果 Protractor 取代 Angular Scenario Runner 进行端到端测试,那么我是否仍然能够将其与 Karma 作为我的 E2E 测试框架一起使用?


在我看来,你应该能够做到这一点。Karma 只是测试运行器。一旦你在 Protractor 中编写/构建了测试用例...当被要求时,karma 应该能够直接运行它。就像你可以要求 Karma 运行现有的 E2E 测试一样。 - skeep
1
@skeep Webdriver通过WebDriver协议生成并连接浏览器,而Karma不支持此功能(它使用WebSockets和网页)。它们以非常不同的方式执行类似的任务。现在已弃用的Karma E2E测试不使用WebDriver,因此受到影响-它们必须在浏览器内维护状态(WebDriver状态完全在浏览器进程之外)。 - Andy
4个回答

104

Protractor的当前维护者不建议一起使用:

https://github.com/angular/protractor/issues/9#issuecomment-19927049

Protractor和Karma不应该一起使用;相反,它们提供了分离的测试运行系统。Protractor和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的灵活性,而对于单元测试,您需要快速执行和文件的自动监视。


现在仍然是真的吗,我们不应该从Karma运行Protractor? - ErikAGriffin
@theLateWizard 绝对正确,不仅你不应该这样做,而且你也做不到 :) - Dmitri Zaitsev
那个第一个链接非常老,来自2013年。它现在还有效吗? - djangofan

76

更新。这里有一个简单的包min-karma,只需要一条命令npm install min-karma就可以将最小化的Karma设置添加到任何项目中。


我想澄清一些关于KarmaProtractor的可能存在的误解。Karma FAQ确实涉及了适用于Angular's Scenario Runner的Adapter,但是这个Adapter似乎已经被放弃了,取而代之推荐使用Protractor


Karma

Karma是一个测试运行器,它将显式地或使用node-globs运行在配置文件中指定的JavaScript文件。(对于非JavaScript的外部模板,Angular的单元测试指南建议先使用Karma html preprocessor将它们编译成JavaScript。)

这些可以是所有您的源文件,其中一些,其中一些加上附加的文件或与您的项目无关的文件,只提供额外的配置 - 只要您想! 您可以为不同目的设置多个karma配置文件,并在并行或逐一运行它们。每个karma进程启动自己的浏览器集(当前可用的)

Karma运行一个文件集的这个功能是使它非常适合在每次源文件编辑时快速运行测试并立即获得反馈,这太棒了!唯一的缺点是"嘈杂"的错误报告希望能改善!


Karma不仅适用于单元测试

单元测试适用于源代码中的单个模块。在Angular中,典型的模块是Angular组件(Service、Factory、Provider、Controller、Filter、Directive等)。请记住保持Controllers简洁,因此对后者进行过多的单元测试是一个警示信号

单元测试中,这个模块所依赖的其他代码单元(即该单元的依赖项)不应在同一时间被测试。相反,它们应该被“mocked”,例如替换为像虚拟实例这样的简单内容。Angular提供了出色的mock环境支持。理想情况下,您希望直接在测试中看到所有这些mock,因此您永远不需要思考所有这些依赖项来自何处。

Karma集成测试中同样有用,其中会同时测试一组源代码单元,而只有某些依赖关系被mocked。重要的是要记住,默认情况下任何依赖项都是从您的源代码模块提供的(只要这些模块直接注入到您的测试中,或者它们是其他模块所依赖的模块(在这种情况下,您不需要注入它们,但也没有害处)。mocked依赖项将覆盖提供的依赖项。

快速且频繁地运行Karma的主要特点。这意味着您要避免任何服务器请求、任何数据库查询或任何可能耗时几秒钟以上的操作。(否则它就不会快速运行!)这些长时间的过程是您想要mock的过程。这也解释了为什么将原始低级服务($http)直接放在控制器或任何复杂的业务逻辑单元中是一个不好的做法。通过将那些低级别的外部通信服务包装成更小的专用服务,您可以更轻松地将其“mock away”。

Karma 不会像端到端(E2E)测试一样运行您的网站,这是它无法做到的事情。原则上,您可以使用Angular的内部方法来重新创建网站或其组成部分。对于小块内容,这可能很有用,是测试指令的一种快速方法。

然而,不建议将复杂代码放入测试中。您越这样做,您犯错误的机会就越大,这些错误实际上是在该代码而不是您正在测试的代码中发生的。

因此,我个人不喜欢使用低级方法(例如$http)来测试方法的常见且复杂的方式。将对低级方法的任何引用隔离到自己的专用方法中更为清晰,其单一职责是进行HTTP请求。这些专用方法应该能够使用真正的后端而不是虚假的!你可以轻松地手动测试它们,甚至可以在另一个特殊配置下与Karma运行得非常好,只要不将该配置与通常用于运行Karma的配置混合即可。

现在,通过测试您的专用小服务,您可以安全且轻松地模拟它们以测试其他逻辑,并将这些测试放入您的常规Karma设置中。

总结。使用Karma来运行任何一组JavaScript文件。它(应该)很快。您看不到完整的应用程序,因此无法有效且可靠地测试最终结果。我会使用Protractor吗?为什么会呢?运行Protractor会减慢我的测试速度,违背了使用Karma的目的。很容易单独运行Protractor


Protractor

Protractor是:

用于AngularJS应用程序的端到端测试框架。Protractor在实际浏览器中运行与之交互,就像用户一样运行测试。

因此,Protractor正是Karma无法做到的-运行您的真实最终应用程序。这揭示了它的强大和局限性:

运行完整的应用程序是唯一可靠的最终测试,以确保您的应用程序按预期工作。您可以编写完整的用户故事场景并将其放入测试中!

但是,在不隔离源代码的单个单位的情况下,更难跟踪错误。这就是为什么您仍然需要首先使用Karma来测试JavaScript代码。


现在我是否想要使用Karma运行Protractor?我当然可以在单独的终端窗口中并行运行它们。原则上,如果需要,我可以让它们共享测试文件,但通常我不想这样做。为什么?因为我希望保持我的测试小且具有单一的专用目的。

唯一的例外将是一个定义测试宏对于两个运行器都有用的文件。然而,这不会成为一个测试文件,而是一个宏定义文件

除此之外,我喜欢将测试清晰地分开。一部分是要经常快速运行的测试,另一部分是用于整个应用程序的测试。这就在使用KarmaProtractor时建立了明确的区别。


如果我想进行单元测试和端到端测试,那么我必须配置Karma环境以进行单元测试,并使用Protractor进行UI测试或端到端测试吗? - Sunil Garg
@SunilGarg 是的,如果想要同时使用两者,但正如我所写的,Karma 不仅适用于单元测试。 - Dmitri Zaitsev

1

是的,您可以同时使用karma和protractor。 Karma用于单元测试使用angular命令创建的组件,您可以使用karma测试这些组件。 Protractor用于端到端测试。 它主要用于UI测试。


为了实现这一点,您需要为karma和protractor添加配置。 - Rahul Solanki

1
Karma是由Angular团队提供的测试运行器,它将在多个浏览器中执行您的测试,以确保我们的应用程序在所有浏览器中兼容。 对于AngularJS的单元测试可以使用karma + jasmine Jasmine是一个JavaScript单元测试框架,它将为我们提供测试应用程序的实用工具。这在Angular框架上效果最佳,因此我们选择了“自动化单元测试工具”。 https://github.com/shahing/testingangularjs 而Protractor是一个用于Angular和AngularJS应用程序的端到端测试框架。Protractor在真实浏览器、无头浏览器、跨浏览器测试中运行测试,并可托管在Saucelabs上。

https://github.com/shahing/Protractor-Web-Automation


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