如何在 teamcity 中 运行 e2e 测试,如何在后台 运行 服务器和 运行 e2e
How to run e2e tests in teamcity, How to run the server in the background and run e2e
如何 运行 我需要的服务器以及 teamcity 构建步骤中的端到端测试?
我的 angular 2 应用程序有量角器 e2e 测试。 (我混合了 angular-cli 和 gulp,但请耐心等待。)
这是我运行 在本地进行测试的方式。我需要三个控制台 windows (w1,w2,w3).
w1) 我需要做的第一件事是启动我的应用程序:
npm start
-> 我在 package.json 中定义为 ng serve -prod
w2) 然后启动假后端,一个 express webserver
npm run gulp e2e-server
-> 我在包配置中定义了 "gulp": "gulp"
,因为 gulp
不会在 teamcity 上被识别。
3w) 最后我可以 运行 我的 e2e 测试
npm run e2e -- e2e/protractor-teamcity.conf.js
我在我的包配置中定义了 "pree2e": "webdriver-manager update"
和 "e2e": "protractor"
然后...
我需要手动停止我启动的两个服务器。
像这样的 hack 会起作用:
npm run gulp e2e-clean && start "MyWindow" cmd /c "start npm start && npm run gulp e2e-server" && ping -n 31 127.0.0.1 >nul && npm run e2e -- e2e/protractor-teamcity.conf.js
但是 start
创建了永远不会停止的控制台 windows。我不确定这样做的后果是什么(我怀疑这会 运行 成功两次)。 ping 是睡眠黑客,这也不理想。
有没有人找到解决方案运行在测试运行时执行一个命令"in the background",然后在之后杀死它?
所以,这是一个可怕的黑客攻击。那种暗示某些事情的黑客行为是非常错误的,但是 ho-hum:
当 ng serve 运行时 它会将控制台 window 标题 更改为 "angular-cli",当 gulp 运行它时将其更改为 "gulp"(或"select gulp")。我不希望 运行 这些标题会是其他任何内容。 这就够写__kill-running-windows
去杀这些windows了。
Package.json:
"scripts": {
"start": "ng serve -prod",
"test": "gulp test-teamcity",
"pree2e": "webdriver-manager update",
"e2e": "protractor",
"gulp": "gulp",
"e2e-teamcity": "gulp _e2e-clean && npm run _e2e-teamcity & npm run _kill-running-windows",
"_e2e-teamcity": "npm run _e2e-servers && gulp __wait-60 && gulp _e2e-test-teamcity",
"_e2e-servers": "start gulp _e2e-server && start gulp serve",
"_kill-running-windows": "taskkill /fi \"Windowtitle eq gulp\" & taskkill /fi \"Windowtitle eq select gulp\" & taskkill /fi \"Windowtitle eq angular-cli\" & taskkill /fi \"Windowtitle eq select angular-cli\""
},
代码(反正都是比较有意思的地方,比如gulp的就留给读者自己想象吧):
var expressServer = require("gulp-express");
var process = require("child_process");
var shell = require("gulp-shell");
/**
* Run vanilla e2e tests with teamcity reporter
*
* (Remember to call `e2e-server`, `serve` and edit `config.json` to point at config.e2e.json` first)
*/
gulp.task("_e2e-test-teamcity", function(done) {
return gulp.src("")
.pipe(
shell(["npm run e2e -- e2e/protractor-teamcity.conf.js"])
)
});
gulp.task("__wait-60", function(done) {
// HACK: Do 61 pings -> wait 30 seconds
process.exec("ping 127.0.0.1 -n 61 > nul", function (err, stdout, stderr) {
done();
});
});
/**
* Run mock backend for the e2e, with canned answers to all calls
* !! Use config.e2e.json in your application in order to point at this !!
*/
gulp.task("_e2e-server", function () {
expressServer.run(["./e2e/server.js"]);
gulp.watch(["./e2e/server.js"], expressServer.notify);
});
出于某种原因,将更多代码移入 gulp 似乎使构建在 teamcity 上永远无法完成。但这是我在本地使用的 e2e,它更基于 gulp:
/**
* Run vanilla e2e tests
* Cleans screenshots folder, tarts the application, starts the mock server
* Leaves command windows running the servers open at the end of the test run
*
* 30 second wait for tests to start
*
* (Remember to edit `config.json` to point at config.e2e.json` first)
*/
gulp.task("e2e", ["_e2e-clean"], function (done) {
gulp.src("")
.pipe(
shell(["start gulp _e2e-server"])
).pipe(
shell(["start gulp serve"])
);
runSequence("__wait-30","_e2e-test", done);
});
如何 运行 我需要的服务器以及 teamcity 构建步骤中的端到端测试?
我的 angular 2 应用程序有量角器 e2e 测试。 (我混合了 angular-cli 和 gulp,但请耐心等待。)
这是我运行 在本地进行测试的方式。我需要三个控制台 windows (w1,w2,w3).
w1) 我需要做的第一件事是启动我的应用程序:
npm start
-> 我在 package.json 中定义为 ng serve -prod
w2) 然后启动假后端,一个 express webserver
npm run gulp e2e-server
-> 我在包配置中定义了 "gulp": "gulp"
,因为 gulp
不会在 teamcity 上被识别。
3w) 最后我可以 运行 我的 e2e 测试
npm run e2e -- e2e/protractor-teamcity.conf.js
我在我的包配置中定义了 "pree2e": "webdriver-manager update"
和 "e2e": "protractor"
然后...
我需要手动停止我启动的两个服务器。
像这样的 hack 会起作用:
npm run gulp e2e-clean && start "MyWindow" cmd /c "start npm start && npm run gulp e2e-server" && ping -n 31 127.0.0.1 >nul && npm run e2e -- e2e/protractor-teamcity.conf.js
但是 start
创建了永远不会停止的控制台 windows。我不确定这样做的后果是什么(我怀疑这会 运行 成功两次)。 ping 是睡眠黑客,这也不理想。
有没有人找到解决方案运行在测试运行时执行一个命令"in the background",然后在之后杀死它?
所以,这是一个可怕的黑客攻击。那种暗示某些事情的黑客行为是非常错误的,但是 ho-hum:
当 ng serve 运行时 它会将控制台 window 标题 更改为 "angular-cli",当 gulp 运行它时将其更改为 "gulp"(或"select gulp")。我不希望 运行 这些标题会是其他任何内容。 这就够写__kill-running-windows
去杀这些windows了。
Package.json:
"scripts": {
"start": "ng serve -prod",
"test": "gulp test-teamcity",
"pree2e": "webdriver-manager update",
"e2e": "protractor",
"gulp": "gulp",
"e2e-teamcity": "gulp _e2e-clean && npm run _e2e-teamcity & npm run _kill-running-windows",
"_e2e-teamcity": "npm run _e2e-servers && gulp __wait-60 && gulp _e2e-test-teamcity",
"_e2e-servers": "start gulp _e2e-server && start gulp serve",
"_kill-running-windows": "taskkill /fi \"Windowtitle eq gulp\" & taskkill /fi \"Windowtitle eq select gulp\" & taskkill /fi \"Windowtitle eq angular-cli\" & taskkill /fi \"Windowtitle eq select angular-cli\""
},
代码(反正都是比较有意思的地方,比如gulp的就留给读者自己想象吧):
var expressServer = require("gulp-express");
var process = require("child_process");
var shell = require("gulp-shell");
/**
* Run vanilla e2e tests with teamcity reporter
*
* (Remember to call `e2e-server`, `serve` and edit `config.json` to point at config.e2e.json` first)
*/
gulp.task("_e2e-test-teamcity", function(done) {
return gulp.src("")
.pipe(
shell(["npm run e2e -- e2e/protractor-teamcity.conf.js"])
)
});
gulp.task("__wait-60", function(done) {
// HACK: Do 61 pings -> wait 30 seconds
process.exec("ping 127.0.0.1 -n 61 > nul", function (err, stdout, stderr) {
done();
});
});
/**
* Run mock backend for the e2e, with canned answers to all calls
* !! Use config.e2e.json in your application in order to point at this !!
*/
gulp.task("_e2e-server", function () {
expressServer.run(["./e2e/server.js"]);
gulp.watch(["./e2e/server.js"], expressServer.notify);
});
出于某种原因,将更多代码移入 gulp 似乎使构建在 teamcity 上永远无法完成。但这是我在本地使用的 e2e,它更基于 gulp:
/**
* Run vanilla e2e tests
* Cleans screenshots folder, tarts the application, starts the mock server
* Leaves command windows running the servers open at the end of the test run
*
* 30 second wait for tests to start
*
* (Remember to edit `config.json` to point at config.e2e.json` first)
*/
gulp.task("e2e", ["_e2e-clean"], function (done) {
gulp.src("")
.pipe(
shell(["start gulp _e2e-server"])
).pipe(
shell(["start gulp serve"])
);
runSequence("__wait-30","_e2e-test", done);
});