如何在teamcity中运行e2e测试,如何在后台运行服务器并运行e2e

时间:2016-10-27 13:31:28

标签: angularjs cmd protractor teamcity

如何运行我需要的服务器以及团队建设步骤中的e2e测试?

我的角度2应用程序的量角器e2e测试。 (我有一个有趣的混合角度cli和gulp,但忍受我。)

以下是我在本地运行测试的方法。我需要三个控制台窗口(w1,w2,w3)。

w1)我需要做的第一件事是启动我的应用程序:

npm start - >我在package.json中定义为ng serve -prod

w2)然后启动虚假的后端,一个快速的网络服务器

npm run gulp e2e-server - >我在我的包配置中定义了"gulp": "gulp",因为在teamcity上无法识别gulp

3w)然后最后我可以运行我的e2e测试

npm run e2e -- e2e/protractor-teamcity.conf.js 我在我的包配置中定义了"pree2e": "webdriver-manager update""e2e": "protractor"

则...

我需要手动停止我启动的两台服务器。

像这样的黑客行为会起作用:

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会创建永不停止的控制台窗口。我不确定这会带来什么后果(我怀疑这会成功运行两次)。 ping是睡眠黑客,也不理想。

是否有人找到了在测试运行期间“在后台”运行命令并随后将其删除的解决方案?

1 个答案:

答案 0 :(得分:1)

所以,这是一个可怕的黑客。那种暗示某些东西是非常错误的黑客,但是哼哼:

当ng serve运行时,它会将控制台窗口标题更改为“angular-cli”,当gulp运行它时会将其更改为“gulp”(或“select gulp”)。我不希望其他任何东西都会与这些游戏一起运行。 这足以写__kill-running-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);
});