cli 脚手架基于Nightwatch的端到端测试环境的过程(4)

vue-cli webpack脚手架模板非常好用,它将环境的复杂性降低了很多,但是却没有很好地诠释它里面采用的每个模块的理由和功能,以及它们的使用特点。这对于入门者来说确实是将门槛降到最低点,但从工程化开发的角度来说,只知道有这些环境或者工具的存在是远远不够的,在Nightwatch中就埋了一个这样的坑。

我们的开发环境在配置Mocha和Karma时就已经安装了PhantomJS,但如果你细读Nightwatch的默认配置会惊奇地发现根本没有采用PhantomJS,只是配置了Chrome和Firefox!问题何在?一个字:慢!

我曾用一台2013年版标准配置(i5CPU、8GB内存、1TB HDD硬盘)的iMac跑本书下一章中的示例程序,运行一次的实际时间是15秒左右!仅仅一次就得15秒,那可以想象我们开发一个场景最少要做多少次的运行?Chrome的启动是很慢的,我们做E2E这种自动化测试如果用真实浏览器的话

只能将性能拖下来,生命不能耗费在毫无意义的等待中!所以我们才会选择PhantomJS!没有默认配置PhantomJS作为主浏览器是这个环境的最大败笔。

办法总比问题多,所以如果没有,我们还可以自己动手来配置,其实方法也很简单。打开nightwatch.conf.js,在test_settings配置段的下方加入以下的内容:

"test_settings": { "default": { // ... } }, "phantom":{ "desiredCapabilities": { "browserName": "phantomjs", "javascriptEnabled": true, "acceptSslCerts": true, "phantomjs.page.settings.userAgent" : "Mozilla/5.0 (Macintosh; Intel MacOS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36", "phantomjs.binary.path":"node_modules/phantomjs-prebuilt/bin/phantomjs" } }

Nightwatch是通过Selenium加载一个GhostDriver来引导PhantomJS浏览器的,上面的内容就相当于告诉Selenium加载一个GhostDriver,可执行程序则指向npm上安装的phantomjs-prebuilt包,再通过这个包来引导安装在本机上的PhantomJS启动。

按上文这样来引用PhantomJS的二进制程序的地址非常难看,还有原生配置中的Selenium执行程序地址也是一样的,这里介绍一个更DRY的方法来处理这些路径:

var seleniumServer = require('selenium-server'); var phantomjs = require('phantomjs-prebuilt'); module.exports = { // ...省略 "selenium": { // ... 省略 "server_path": seleniumServer.path, }, "test_settings": { // ... 省略 "phantom": { "desiredCapabilities": { // ... 省略 "phantomjs.binary.path": phantomjs.path } } // ... 省略 } }

做完这个简单的优化后就可以打开runner.js文件找到:

if (opts.indexOf('--env') === -1) { opts = opts.concat(['--env', 'chrome']) }

 将chrome改为phantom就行了:

if (opts.indexOf('--env') === -1) { opts = opts.concat(['--env', 'phantom']) }

重新加载测试程序,在同一台iMac上的运行速度直接降到了5秒,测试运行速度提升了3倍!如果你有配置更好的机器,将硬盘换成SSD之后会有更惊人的速度。

Nightwatch 与 Cucumber

如果你正在开发的项目的业务复杂性不大,可以直接使用Nightwatch推荐的链式调用写法。但是当这种做法真正应用在业务流程较多,或者业务操作相对复杂的应用场景时,你会觉得总有写不完的E2E测试,因为这么做E2E测试是没有办法一次性覆盖所有需求的!

E2E测试其实是行为式驱动开发的实现手法,如果跳过了行为式驱动开发的分析部分直接编写E2E,其结果只能是写出一堆严重碎片化的测试场景,甚至会出现很多根本不应该出现的操作。

幸好Nightwatch具有很好的扩展性与兼容性,能集成最正统的BDD测试框架Cucumber(https://cucumber.io/)。Cucumber是原生于Ruby世界的BDD框架,但它也有很多的语言实现版本,我们可以安装一套专门为Nightwatch编写的Cucumber版本——nightwatch-cucumber(https://github.com/mucsi96/nightwatch-cucumber)。本章只介绍关于环境与工具的配置,而关于如何来应用BDD,内容已经超出了本书的知识范围,如果有兴趣的话可以参考《攀登架构之巅》一书中行为式驱动开发的章节内容。

$ npm i nightwatch-cucumber -D

然后在~/test/e2e/nightwatch.conf.js文件中加入对Cucumber的配置:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/62714f18e2ec5be970d0b5711dd26c25.html