如何创建一个npm脚本来运行几个命令来运行一些测试?

时间:2014-07-30 16:05:09

标签: angularjs testing npm

当我为angularjs应用程序运行e2e测试时,我需要在不同的shell会话中运行以下命令:

// start the selenium server
webdriver-manager start

// start a http server to serve current files
node_modules/http-server/bin/http-server .

// run the e2e tests
protractor test/protractor-conf.js

当我启动它们时,前2个命令将继续运行。

我尝试添加一个npm脚本来定义一起运行它们的任务:

"scripts" : {
    "e2e-test": "webdriver-manager start && node_modules/http-server/bin/http-server . && protractor test/protractor-conf.js"
}

当我通过以下方式运行时,问题是:

npm run-script e2e-test

它只运行第一个并阻塞,其他人没有机会运行。

这样做的最佳解决方案是什么?

2 个答案:

答案 0 :(得分:19)

问题是webdriver-manager start和你的http服务器需要作为守护进程运行,或者在&的后台运行,如下所示:

"e2e-test": "(webdriver-manager start &) && sleep 2 && (node_modules/http-server/bin/http-server . &) && protractor test/protractor-conf.js"

还添加了sleep 2等待selenium服务器启动,你可以通过使用

阻止脚本来获得活跃的等待
while ! nc -z 127.0.0.1 4444; do sleep 1; done

在这种情况下,通过提取所有" e2e-test" shell行成一个单独的脚本,即

"e2e-test": "your-custom-script.sh"

然后your-custom-script.sh

#!/usr/bin/env bash

# Start selenium server just for this test run
(webdriver-manager start &)
# Wait for port 4444 to be listening connections
while ! nc -z 127.0.0.1 4444; do sleep 1; done

# Start the web app
(node_modules/http-server/bin/http-server . &)
# Guessing your http-server listen at port 80
while ! nc -z 127.0.0.1 80; do sleep 1; done

# Finally run protractor
protractor test/protractor-conf.js

# Cleanup webdriver-manager and http-server processes
fuser -k -n tcp 4444
fuser -k -n tcp 80

答案 1 :(得分:3)

您应该使用npm-run-all(或concurrentlyparallelshell),因为它可以更好地控制启动和终止命令。运算符&|是不好的主意,因为您需要在所有测试完成后手动停止它。

安装npm-run-onceprotractorhttp-server后,您可以像这样修改package.json:

scripts: {
  "webdriver-start": "./node_modules/protractor/bin/webdriver-manager update && ./node_modules/protractor/bin/webdriver-manager start",
  "protractor": "./node_modules/protractor/bin/protractor ./tests/protractor.conf.js",
  "http-server": "./node_modules/http-server/bin/http-server -a localhost -p 8000",
  "python-example": "python -m SimpleHTTPServer",
  "test1": "npm-run-all -p -r webdriver-start http-server protractor",
  "test2": "npm-run-all -p -r webdriver-start python-example protractor"
}

-p =并行运行命令。

-r =当其中一个命令以零结束时,终止所有命令。

运行npm run test1将启动Selenium驱动程序,启动http服务器(为您提供文件)并运行量角器测试。完成所有测试后,它将关闭http服务器和selenium驱动程序。