Protractor 和 Karma 可以一起使用吗?

Posted

技术标签:

【中文标题】Protractor 和 Karma 可以一起使用吗?【英文标题】:Can Protractor and Karma be used together? 【发布时间】:2013-06-08 20:41:10 【问题描述】:

如果 Protractor 正在取代 Angular Scenario Runner 进行 E2E 测试,这是否意味着我仍然可以将它与 Karma 一起用作我的 E2E 测试框架?

【问题讨论】:

IMO 你应该可以。业力只是测试运行者。一旦你在 Protractor 中编写/构建了你的测试用例...... karma 应该能够在被问到时运行它。您可以要求 Karma 运行现有的 E2E 测试。 @skeep Webdriver 通过 WebDriver 协议生成并连接到浏览器——Karma 不支持的东西(它使用 WebSockets 和网页代替)。他们以非常不同的方式执行类似的任务。现在已弃用的 Karma E2E 测试不使用 WebDriver 并因此受到影响 - 它们必须在浏览器中维护状态(WebDriver 状态完全在浏览器进程之外)。 【参考方案1】:

目前 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 仍然是真的吗? @theLateWizard 绝对正确,不仅你不应该,你不能:) 第一个链接真的很旧,从 2013 年开始。它仍然是真的吗?【参考方案2】:

更新。这是一个simple package I've created,可通过一个命令npm install min-karma 为任何项目添加最小的Karma 设置。


我想澄清一些关于 KarmaProtractor 的可能误解。 Karma FAQ 实际上确实引用了 Adapter for Angular's Scenario Runner,但是,它似乎已被放弃,而是推荐使用 Protractor


业力

Karma 是一个测试运行程序,它将显式运行 you configuration file 中的 指定 文件或使用 node-globs 运行 JavaScript 文件。 (对于非 javascript 外部模板,Angular's Unit Testing Guide 建议先使用 Karma html preprocessor 将它们编译成 JavaScript。)

这些可以是所有您的源文件,一些,其中一些加上一些附加文件或文件不相关 到你的项目,只提供一些额外的配置 - 你命名它! 您可以拥有多个用于不同目的的 karma 配置文件,您可以并行或一个接一个地运行它们。每个业力进程都会启动自己的一组浏览器(these are currently available)。

Karma 的这一功能仅运行一组文件,这使其非常适合在每个源文件的后台运行快速测试编辑并获得即时反馈,这太棒了!唯一的缺点是“嘈杂”的错误报告,有望得到改善!


Karma 不仅适用于单元测试

Unit test 用于源代码的单个单元。在 Angular 的例子中,一个典型的单元是 Angular 组件(Service, Factory, Provider, Controller, Filter, Directive 等)。请记住保持Controllers 精简,因此对后者进行过多的单元测试是一个危险信号

单元测试中,不应同时测试该单元所依赖的所有其他代码单元(所谓的单元依赖项)。相反,他们应该被“嘲笑”,例如被一些简单的东西代替,比如虚拟实例。 Angular 提供great mock environment support。理想情况下,您希望直接在测试中查看所有这些模拟,因此您永远不需要怀疑所有这些依赖项来自哪里。

Karma 对于Integration Tests 也同样有用,其中一组源代码单元 一起测试,只有它们的一些依赖项 被嘲笑。重要的是要记住,默认情况下,任何依赖项都是从您的源代码模块提供的(只要这些模块或者injected directly in your tests,或者它们是其他注入模块的依赖项(在这种情况下,您不需要注入它们,但是这样做没有害处)。模拟的依赖项将覆盖提供的依赖项。

跑得又快又频繁Karma的主要特点。这意味着您要避免任何服务器请求、任何数据库查询以及任何可能花费超过几分之一秒的事情。 (否则它不会很快!)那些漫长的过程是你想要模拟的。这也解释了为什么将像$http 这样的原始低级服务直接放在控制器或任何复杂的业务逻辑单元中是一种不好的做法。通过将这些低级外部通信服务封装到更小的专用服务中,您可以更轻松地“模拟它们”。

Karma 不做的是按原样运行您的网站,这就是端到端 (E2E) 测试。原则上,您可以使用 Angular 的内部方法来重新创建站点或其部分。对于小件,这可能很有用,而且是一种快速的方式,例如测试指令。

然而,不推荐在测试中抛出复杂的代码。你做的越多,你在那个代码中出错的机会就越大,而不是你实际测试的地方。

这就是为什么我个人不喜欢经常提到的使用$http 之类的低级方法来测试方法的复杂方式。将任何对低级方法的引用隔离到您自己的专用方法 中,其唯一职责 是发出http 请求,这样会更干净。这些专用方法应该能够与真正的后端一起使用,而不是假的!您可以轻松地进行测试 - 手动甚至完全可以使用 另一个特殊配置 运行 Karma,只要您不将该配置与通常用于运行的配置混合Karma 规律而快速。 现在,对您的专用小型服务进行测试后,您可以安全轻松地模拟它们来测试您的其他逻辑,并将这些测试放入您的常规 Karma 设置中。


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


量角器

Protractor 是:

AngularJS 应用程序的端到端测试框架。 Protractor 针对您在真实浏览器中运行的应用程序运行测试,并像用户一样与之交互。

所以 Protractor 完全可以完成 Karma 没有的工作 - 运行您真正的最终应用程序。这揭示了它的力量和局限性:

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

但是如果不隔离源代码的各个单元,就很难跟踪错误。这就是为什么您仍然需要 Karma 来首先测试您的 JavaScript 代码。


现在我想用 Karma 运行 Protractor 吗?我当然可以在单独的终端窗口中并行运行它们。如果需要,我原则上可以让他们共享测试文件,但通常我宁愿不这样做。为什么?因为我想用一个专门的目的来保持我的测试很小。

唯一的例外是定义测试宏对两个跑步者都有用的文件。然而,这不是一个测试文件,而是一个宏定义文件

除此之外,我喜欢我的测试之间的清晰分离。那些要经常快速运行的,以及那些用于完整应用程序的。这清楚地区分了使用 KarmaProtractor

【讨论】:

如果我想要单元测试以及 e2e 测试,那么我必须为单元测试和量角器配置 karma 环境以进行 ui 测试或 e2e 测试? @SunilGarg 是的,如果想同时使用两者,但正如我所写,Karma 不仅用于单元测试。【参考方案3】:

Karma 是 Angular 团队提供的测试运行器,Karma 将在多个浏览器中执行您的测试,以确保我们的应用程序在所有浏览器中兼容。 Angular js的单元测试可以使用karma + jasmine

Jasmine 是一个 javascript 单元测试框架,它将为我们提供实用程序来测试我们的应用程序。这在 Angular 框架上效果最好,因此,我们选择了“自动化单元测试工具”。 https://github.com/shahing/testingangularjs

Protractor 是 Angular 和 AngularJS 应用程序的端到端测试框架。 Protractor 针对您在真实浏览器、无头浏览器、跨浏览器测试中运行的应用程序运行测试,并且可以托管在 saucelabs 上。

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

【讨论】:

【参考方案4】:

是的,你可以同时使用业力和量角器。 Karma 用于对您使用 angular 命令创建的组件进行单元测试,您可以使用 karma 测试这些组件。 量角器用于端到端测试。主要用于UI测试。

【讨论】:

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

以上是关于Protractor 和 Karma 可以一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

Karma Istanbul 修复程序可与新版本的 Chrome 一起使用

Omi原理-环境搭建

在我的 JSPM 包上使用 JSPM 404 进行 Karma/Jasmine 单元测试

你可以同时使用 Protractor 和 Appium 来测试混合应用程序吗?

使用Microsoft Edge设置Protractor

如何使用 Aurelia 和 typescript 获得业力覆盖?