如果Protractor正在替换 Angular Scenario Runner 进行 E2E 测试,这是否意味着我仍然可以将它与Karma 一起用作我的 E2E 测试框架?
量角器和 Karma 可以一起使用吗?
当前 Protractor 维护者不推荐:
https://github.com/angular/protractor/issues/9#issuecomment-19927049
量角器和 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 设置npm install min-karma
。
我想澄清一些关于Karma和Protractor 的可能误解。Karma FAQ实际上确实提到了Adapter for Angular 的 Scenario Runner,然而,它似乎被放弃了,而是推荐了量角器。
业力
噶是一个测试运行器将运行的JavaScript文件指定在您的配置文件明确或使用节点水珠。(对于非 JavaScript 的外部模板,Angular 的单元测试指南建议先使用Karma html 预处理器将它们编译成 JavaScript。)
这些可以是你所有的源文件,其中一些,其中一些加上一些额外的文件或与你的项目无关的文件,只提供一些额外的配置 - 你说出来!您可以有多个用于不同目的的 karma 配置文件,您可以并行或一对一运行。每个 karma 进程都会启动自己的一组浏览器(这些是当前可用的)。
此功能的噶只运行一组文件,是什么使得它非常适合于在每一个源文件编辑后台运行快速测试,并得到即时的反馈,这是辉煌!唯一的缺点是“嘈杂”的错误报告,希望能有所改善!
Karma 不仅用于单元测试
单元测试适用于源代码的单个单元。在 Angular 的情况下,一个典型的单位是 Angular Component(Service, Factory, Provider, Controller, Filter, Directive
等等)。记住要保持Controllers
瘦身,因此对后者进行过多的单元测试是一个危险信号。
在单元测试中,不应同时测试该单元所依赖的所有其他代码单元(所谓的单元依赖项)。相反,它们应该被“模拟”,例如,用一些简单的东西来代替,比如虚拟实例。Angular 提供了很好的模拟环境支持。理想情况下,您希望直接在测试中查看所有这些模拟,因此您永远不需要想知道所有这些依赖项来自哪里。
Karma对集成测试同样有用,其中一组源代码单元被一起测试,只有它们的一些依赖项被模拟。重要的是要记住,默认情况下,任何依赖项都是从您的源代码module中提供的(只要这些module直接注入您的测试中,或者它们是注入的其他module的依赖项(在这种情况下,您不需要注入它们) , 但这样做没有害处). 模拟的依赖项将覆盖提供的依赖项。
快速和频繁地运行是Karma的主要特点。这意味着您要避免任何服务器请求、任何数据库查询,以及任何可能需要几分之一秒以上的时间。(否则它不会很快!)那些长的过程是你想要模拟的。这也解释了为什么将原始低级服务$http
直接放在控制器或任何复杂的业务逻辑单元中是一种不好的做法。通过将那些低级别的外部通信服务包装到较小的专用服务中,您可以更轻松地“模拟它们”。
什么噶 不不运行您的网站,因为它是,这是最终的端到端(E2E)测试是什么。原则上,您可以使用 Angular 的内部方法来重新创建站点或其部分。对于小块,这可能很有用,并且是一种快速的方法,例如测试指令。
但是,不建议在测试中抛出复杂的代码。你做的越多,你在该代码中而不是你实际测试的内容中出错的可能性就越大。
这就是为什么我个人不喜欢经常提到的使用像$http
. 它将对低级方法的任何引用隔离到您自己的专用方法中,其唯一职责是发出 http 请求。这些专用方法应该能够与真正的后端一起使用,而不是假的!您可以轻松测试 - 手动或什至在Karma与另一个特殊配置一起运行时完全没问题,只要您不将该配置与通常用于运行Karma 的配置混合定期和快速。现在,通过测试您的专用小型服务,您可以安全轻松地模拟它们来测试您的其他逻辑并将这些测试放入您的常规Karma设置中。
总结一下。使用Karma运行任何一组 JavaScript 文件。它(应该)很快。您看不到完整的应用程序,因此无法有效且可靠地测试最终结果。我会用量角器运行它吗?我为什么要?运行Protractor会减慢我的测试速度,违背Karma的目的。单独运行Protractor很容易。
量角器
量角器是:
AngularJS 应用程序的端到端测试框架。Protractor 针对在真实浏览器中运行的应用程序运行测试,并像用户一样与之交互。
所以Protractor做的正是Karma没有做的——运行你真正的最终应用程序。这揭示了它的力量和局限性:
运行完整的应用程序是您的应用程序按预期工作的唯一可靠的最终测试。您可以编写完整的用户故事场景并将它们放入您的测试中!
但是如果不隔离源代码的各个单元,就很难跟踪错误。这就是为什么您仍然需要Karma来首先测试您的 JavaScript 代码。
现在我想用Karma运行Protractor吗?我当然可以在单独的终端窗口中并行运行它们。原则上,如果需要,我可以让他们共享测试文件,但通常我宁愿不这样做。为什么?因为我想让我的测试小而有单一的专用目的。
唯一的例外是定义对两个跑步者都有用的测试宏的文件。但是,这不是测试文件,而是宏定义文件。
除此之外,我喜欢我的测试之间的明确分离。那些经常和快速运行的,以及那些完整的应用程序。这明确区分了使用Karma和Protractor 的情况。
Karma 是 Angular 团队提供的测试运行器,Karma 将在多个浏览器中执行您的测试,以确保我们的应用程序在所有浏览器中兼容。 Angular js 的单元测试可以使用 karma + jasmine
Jasmine 是一个 javascript 单元测试框架,它将为我们提供实用程序来测试我们的应用程序。这在 Angular 框架上效果最好,因此,我们选择了“自动化单元测试工具”。 https://github.com/shahin/testingangularjs
Protractor 是 Angular 和 AngularJS 应用程序的端到端测试框架。量角器针对在真实浏览器中运行的应用程序、无头浏览器、跨浏览器测试运行测试,并且可以托管在酱汁实验室中。
是的,您可以同时使用业力和量角器。Karma 用于对您使用 angular 命令创建的组件进行单元测试,您可以使用 karma 测试这些组件。量角器用于端到端测试。它主要用于 UI 测试。