量角器和业力可以一起使用吗?


104

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


海事组织,你应该能够。业力只是测试赛跑者。一旦您在量角器中编写/构建了测试用例...。业力应该能够在被询问时运行它。您可以以同样的方式要求Karma运行当前的E2E测试。
2013年

1
@skeep Webdriver通过WebDriver协议生成并连接到浏览器-Karma不支持某些功能(它使用WebSocket和一个网页)。他们以完全不同的方式执行相似的任务。现在不推荐使用的Karma E2E测试不会使用WebDriver并因此而受苦-它们必须在浏览器内维护状态(WebDriver状态完全在浏览器进程之外)。
安迪

Answers:


102

量角器的当前维护者不推荐使用:

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

量角器和业力不应一起使用;而是为运行测试提供了单独的系统。量角器和业力涉及测试的不同方面-业力主要用于单元测试,而量角器应用于端到端测试。

Protractor基于WebDriverJS构建,该WebDriverJS使用Selenium / WebDriver服务器来配置浏览器并驱动测试执行。可以在以下位置找到纯WebDriverJS的示例:http : //code.google.com/p/selenium/wiki/WebDriverJs

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

Georgios-我认为将量角器和Karma分开是有意义的-对于端到端测试,您需要本机事件驱动和webdriver的灵活性,而对于单元测试,则需要快速执行和自动监视文件。


我们不应该从业力中运行量角器,这仍然是事实吗?
ErikAGriffin

@theLateWizard绝对正确,不仅您不应该,您不能:)
Dmitri Zaitsev 2015年

74

更新。这是我创建的一个简单的包,用一个命令将最小的Karma设置添加到任何项目中npm install min-karma


我想澄清一些关于业力量角器的误解。Karma FAQ实际上确实引用了Angular的Scenario Runner适配器,但是它似乎已被放弃,建议使用Protractor


业力

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

这些可以是您的所有源文件,其中的一些,其中的一些,再加上一些其他文件或您的项目无关的文件,仅提供一些额外的配置-命名!您可以具有多个用于不同用途的业力配置文件,这些文件可以并行或一对一运行。每个业力过程都会启动自己的浏览器集(目前可用)

功能只运行一组文件,是什么使得它非常适合于在每一个源文件编辑后台运行快速测试,并得到即时的反馈,这是辉煌!唯一的负面影响是“嘈杂”的错误报告,有望改善!


业力不仅用于单元测试

单元测试是针对源代码的单个单元。在Angular的情况下,典型单位是Angular Component(Service, Factory, Provider, Controller, Filter, Directive等)。记住要保持Controllers苗条,因此太多的单元测试是一个危险信号

单元测试中,不应同时测试该单元所依赖的其他所有代码单元(所谓的单元依赖性)。相反,应该“模拟”它们,例如,用诸如虚拟实例之类的简单对象代替。Angular提供了强大的模拟环境支持。理想情况下,您希望直接在测试中看到所有这些模拟,因此您无需怀疑所有这些依赖来自何处。

业力对于集成测试同样有用,在集成测试中,一组源代码单元被一起测试,只有部分依赖关系被模拟。重要的是要记住,默认情况下,源代码模块会提供任何依赖关系(只要这些模块直接注入到测试中,或者它们是注入的其他模块的依赖关系,在这种情况下,您无需注入它们,但这样做没有害处。)模拟的依赖项将覆盖提供的依赖项。

快速运行Karma的主要功能。这意味着您要避免任何服务器请求,任何数据库查询或任何可能花费几分之一秒以上的时间。(否则它不会很快!)那些长进程是您要模拟的进程。这也解释了为什么将原始的低层服务(例如$http直接放置在控制器或任何复杂的业务逻辑单元中)是不好的做法。通过将那些较低级别的外部通信服务包装到较小的专用服务中,您可以更轻松地“模拟”它们。

什么 不不运行您的网站,因为它是,这是最终的端到端(E2E)测试是什么。原则上,您可以使用Angular的内部方法来重新创建网站或其片段。对于小块,这可能是有用的,并且是例如测试指令的快速方法。

但是,不建议在测试中添加复杂的代码。您做得越多,您在该代码中而不是在实际测试中出错的机会就越大。

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


总结一下。使用Karma运行任何JavaScript文件集。(应该)很快。您看不到完整的应用程序,因此无法有效,可靠地测试最终结果。我可以和量角器一起运行吗?我为什么要?运行量角器会减慢我的测试中,击败的目的。单独运行量角器很容易。


量角器

量角器是:

AngularJS应用程序的端到端测试框架。量角器针对在真实浏览器中运行的应用程序运行测试,并与用户进行交互。

因此,量角器完全可以执行Karma不执行的操作-运行您真正的最终应用程序。这显示了它的力量和局限性:

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

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


现在我想和Karma一起运行量角器吗?我当然可以在单独的终端窗口中并行运行它们。原则上,我可以根据需要让他们共享测试文件,但通常我宁愿不这样做。为什么?因为我想通过单一的专用目的使我的测试小。

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

除此之外,我喜欢在测试之间清楚地分开。那些要经常且快速运行的程序,以及那些用于完整应用程序的程序。这在使用Karma和何时使用Protractor之间有明显的区别


如果我想要单元测试以及e2e测试,那么我必须配置karma环境以进行单元测试,而将量角器配置为ui测试或e2e测试?
Sunil Garg,2013年

@SunilGarg是的,如果要同时使用它们,但是正如我所写的,Karma不仅用于单元测试。
Dmitri Zaitsev

1

Karma是Angular团队提供的测试运行程序,Karma将在多个浏览器中执行您的测试,这将确保我们的应用程序在所有浏览器中都兼容。 Angular JS的单元测试可以使用业力+茉莉花

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

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

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


1

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


为此,您需要添加因果和量角器的配置
Rahul Solanki
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.