hol*_*ple 102 javascript testing angularjs karma-runner protractor
如果Protractor正在取代Angular Scenario Runner进行E2E测试,这是否意味着我仍然可以将它与Karma一起用作我的E2E测试框架?
jac*_*ack 101
当前的量角器维护者不推荐:
https://github.com/angular/protractor/issues/9#issuecomment-19927049
量角器和Karma不应该一起使用; 相反,它们为运行测试提供单独的系统.量角器和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的灵活性,而对于单元测试,您需要快速执行和自动操作文件.
Dmi*_*sev 74
UPDATE.这是一个我创建的简单包,用于通过一个命令将最小的Karma设置添加到任何项目npm install min-karma
.
我想澄清一些关于Karma和Protractor的误解.实际上,Karma FAQ确实引用了适用于Angular的Scenario Runner的适配器,然而,似乎放弃了,而推荐使用Protractor.
噶是一个测试运行器将运行的JavaScript文件指定在您的配置文件明确或使用节点水珠.(对于非JavaScript 外部模板,Angular的单元测试指南建议首先使用Karma html预处理器将它们编译为JavaScript.)
这些可以是您的所有源文件,其中一些,其中一些以及一些与您的项目无关的其他文件或文件,只提供一些额外的配置 - 您可以命名它!您可以将多个karma配置文件用于不同目的,您可以并行或逐个运行.每个业力流程都会启动自己的一组浏览器(这些浏览器目前可用).
此功能的噶只运行一组文件是什么使得它非常适合于在每一个源文件编辑后台运行快速测试的,并得到即时的反馈,这是辉煌!唯一不利的是"嘈杂"错误报告,希望有所改善!
单元测试适用于源代码的单个单元.在Angular的情况下,典型的单位是角度分量(Service, Factory, Provider, Controller, Filter, Directive
等).记得保持你的Controllers
瘦身,因此过多的单位测试是一个红旗.
在单元测试中,不应该同时测试该单元所依赖的每个其他代码单元(所谓的单元的依赖性).相反,它们应该被"嘲笑",例如被简单的虚拟实例替换.Angular提供了很好的模拟环境支持.理想情况下,您希望直接在测试中看到所有这些模拟,因此您永远不需要知道所有这些依赖项的来源.
Karma对集成测试同样有用,其中一组源代码单元一起测试,只有一些依赖项被模拟.重要的是要记住,默认情况下,任何依赖都是从源代码模块提供的(只要这些模块直接在测试中注入,或者它们是注入的其他模块的依赖项(在这种情况下,您不需要注入它们)但是没有坏处.)模拟的依赖项将覆盖提供的依赖项.
快速和频繁地运行是Karma的主要特征.这意味着您希望避免任何服务器请求,任何数据库查询,任何可能需要超过几秒的事情.(否则它不会很快!)那些漫长的过程就是你想要模仿的过程.这也解释了为什么将原始低级服务$http
直接放在控制器或任何复杂的业务逻辑单元中是一种不好的做法.通过将这些低级别的外部通信服务包装到较小的专用服务中,您可以更轻松地"模拟它们".
什么噶 不这样做是运行您的网站,因为它是,这是最终的端到端(E2E)测试是什么.原则上,您可以使用Angular的内部方法来重新创建站点或其部分.对于小件,它可能是有用的,并且是一种快速的方式,例如测试指令.
但是,不推荐在测试中抛出复杂代码的方法.你做的越多,你在代码中犯错的可能性就越大,而不是你实际测试的错误.
这就是为什么我个人不喜欢经常提到的使用低级方法测试方法的复杂方法$http
.它可以更清晰地将对低级方法的任何引用隔离到您自己的专用方法中,其唯一的任务是发出http请求.这些专用方法应该能够使用真正的后端,而不是假的!您可以轻松地测试 - 手动甚至完美地使用另一个特殊配置运行Karma,只要您不将该配置与通常用于常规和快速运行Karma的配置混合.现在,通过测试您的专用小型服务,您可以安全轻松地模拟它们以测试您的其他逻辑并将这些测试放入您的常规Karma设置中.
总结一下.使用Karma运行任何JavaScript文件集.它应该(应该)快.您没有看到完整的应用程序,因此无法有效可靠地测试最终结果.我会用Protractor运行吗?我为什么要?运行量角器会减慢我的测试速度,打败Karma的目的.单独运行Protractor很容易.
量角器是:
AngularJS应用程序的端到端测试框架.量角器针对在真实浏览器中运行的应用程序运行测试,并以用户的身份与其进行交互.
因此,Protractor正是Karma所做的 - 运行您真正的最终应用程序.这揭示了它的力量和局限:
运行完整的应用程序是您的应用程序按预期工作的唯一可靠的最终测试.您可以编写完整的用户故事场景并将其放入测试中!
但是,如果不隔离源代码的各个单元,就很难跟踪错误.这就是为什么你仍然需要Karma首先测试你的JavaScript代码.
现在我想用Karma运行Protractor吗?我当然可以在单独的终端窗口中并行运行它们.原则上,如果需要的话,我可以让他们共享测试文件,但通常我不愿意.为什么?因为我希望通过一个专门的目的来保持我的测试.
唯一的例外是定义测试宏的文件对两个运行者都有用.但是,这不是测试文件而是宏定义文件.
除此之外,我喜欢我的测试之间的明确分离.那些经常和快速运行,以及完整的应用程序.这在使用Karma和Protractor时明确分开.