量angular器和噶玛可以一起使用吗?

如果Protractorreplace了E2Etesting的Angular Scenario Runner,那么这是否意味着我仍然可以将它作为我的E2Etesting框架与Karma一起使用?

不是量angular器目前的维护者推荐的:

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

量angular器和噶玛不应该一起使用; 相反,他们提供单独的系统来运行testing。 量angular器和Karma涵盖了testing的不同方面 – Karma主要用于unit testing,而Protractor应该用于端到端testing。

量angular器build立在WebDriverJS之上,使用Selenium / WebDriver服务器configuration浏览器并驱动testing执行。 纯WebDriverJS的例子可以在这里find: http : //code.google.com/p/selenium/wiki/WebDriverJs

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

Georgios – 我认为把Protractor和Karma分开是有道理的 – 对于端到端testing,你需要本地事件驱动和webdriver的灵活性,而对于unit testing你希望快速执行和自动处理文件。

UPDATE。 下面是我创build的一个简单的包,它用一个命令npm install min-karma为任何项目添加最小的Karma安装。


我想澄清一下关于Karma量angular器的一些可能的误解。 Karma常见问题解答实际上是指适配器为Angular的情景亚军 ,但是,似乎被放弃,推荐使用量angular器


因果报应

Karma是一个testing运行器,它将显式地运行您在configuration文件中 指定JavaScript文件,或者使用node-globs 。 (对于非JavaScript 外部模板 , Angular的“unit testing指南”build议使用Karma html预处理器首先将其编译为JavaScript。)

这些可以是你的所有源文件, 其中一些 ,其中一些还有一些额外的文件或文件你的项目无关 ,只是提供一些额外的configuration – 你的名字! 你可以有多个karmaconfiguration文件用于不同的目的,你可以并行或一个一个地运行。 每个业力进程启动自己的一套浏览器(这些浏览器目前可用) 。

Karma的这个function只运行一组文件 ,这使得它在每个源文件编辑后在后台运行的快速testing非常完美,并且得到即时反馈,这非常棒! 唯一的负面是“嘈杂”的错误报告,希望能够改善!


噶不仅是unit testing

unit testing是针对您的源代码的一个单元。 在Angular的情况下,一个典型的单位是angular度组件( Service, Factory, Provider, Controller, Filter, Directive等)。 记住保持你的Controllers精简,所以太多的unit testing是一个红旗

unit testing中 ,本单元所依赖的所有其他代码单元(所谓的单元依赖性)不应该同时进行testing。 相反,他们应该被“嘲弄”,例如被简单的虚拟实例所取代。 Angular提供了很好的模拟环境支持 。 理想情况下,您希望直接在您的testing中看到所有这些模拟,所以您永远不需要知道所有这些依赖来自哪里。

Karma对集成testing是有用的,在这个testing中 ,一组源代码单元一起被testing,只有一些依赖被模拟。 重要的是要记住,任何依赖项都是从你的源代码模块默认提供的(只要这些模块直接在你的testing中注入 ,或者它们是注入其他模块的依赖项(在这种情况下你不需要注入它们但是这样做不会有什么坏处)嘲笑的依赖会覆盖提供的依赖。

运行快速和频繁噶玛的主要特点。 这意味着你想要避免任何服务器请求,任何数据库查询,任何可能花费比几秒钟更长的时间。 ( 否则它不会很快! )那些漫长的过程就是你想要嘲笑的过程 。 这也解释了为什么在您的控制器或任何复杂的业务逻辑单元中直接放置原始低层服务(如$http是一种不好的做法。 通过将这些低层次的外部通信服务包装到更小的专用服务中,您可以更容易“嘲笑”这些服务。

Karma 不能做的就是运行你的站点,这就是端到端(E2E)testing。 原则上,您可以使用Angular的内部方法重新创build网站或其片断。 其中,小件,可以是有用的,快速的方式,如testing指令。

但是, 不build议在testing中抛出复杂的代码。 你做得越多,你在代码中犯的错误就越多而不是你正在testing的东西。

这就是为什么我个人不喜欢经常提到的使用低级方法(如$httptesting方法的复杂方式。 它的工作原理更清晰,可以将对低级别方法的引用隔离为您自己的专用方法 ,其唯一职责是发出http请求。 这些专用的方法应该能够处理真实的后端 ,而不是假的! 你可以很容易地testing – 手动或甚至完全正确地使用Karma运行另一个特殊的configuration ,只要你不要把那个configuration和通常用来定期和快速运行Karma的configuration混合在一起。 现在,通过testing您的专用小型服务,您可以安全,轻松地嘲笑他们testing您的其他逻辑,并将这些testing放入常规的Karma设置中。


总结。 使用Karma运行任何一组JavaScript文件。 这是(应该)快。 你没有看到你的完整的应用程序,所以不能有效和可靠地testing最终结果 。 我会用量angular器来运行吗? 我为什么要? 运行量angular器会减慢我的testing,击败噶玛的目的。 分开运行量angular器很容易。


量angular器

量angular器是:

AngularJS应用程序的端到端testing框架。 量angular器对运行在真实浏览器中的应用程序运行testing,并按照用户的意愿进行交互。

所以量angular器正是Karma所不具备的 – 运行真正的最终应用程序。 这揭示了它的力量和局限性:

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

但是如果不隔离源代码的单个单元, 就很难追踪错误 。 这就是为什么你仍然需要Karma先testing你的JavaScript代码。


现在我想和Karma运行量angular器 ? 我当然可以在单独的terminal窗口中并行运行它们。 原则上,我可以让他们分享testing文件,如果我需要,但通常我宁愿不。 为什么? 因为我想用一个专门的目的保持我的testing小。

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

除此之外,我喜欢我的testing之间的明确分离。 那些经常和快速运行,以及完整的应用程序。 这使得当使用Karma和当量angular器之间明显分离。