2016-10-27 103 views
2

如何在teamcity構建步驟中運行我需要的服務器以及e2e測試?如何在teamcity中運行e2e測試,如何在後臺運行服務器並運行e2e

我有量角器e2e測試我的角2應用程序。 (我有一個角度cli和gulp的有趣混合,但忍受着我。)

這是我如何在本地運行我的測試。我需要三個控制檯窗口(w1,w2,w3)。

W1)我需要做的第一件事就是開始我的應用程序:

npm start - >我在的package.json定義爲ng serve -prod

W2)接着開始假後端,明確網絡服務器

npm run gulp e2e-server - >我定義我的包中配置"gulp": "gulp",因爲gulp不會在TeamCity的認可。

3瓦特)然後我終於可以運行我的端對端測試

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

所以,這是一個可怕的黑客攻擊。這種暗示暗示某事是深刻的錯誤,但ho-hum:

當ng serve runs 它將改變控制檯窗口標題爲「angular-cli」,當gulp運行它將它改爲「gulp 「(或」選擇吞嚥「)。我不希望別的東西會與這些標題一起運行。 這足以寫入__kill-running-windows去殺掉這些窗口。

包。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\"" 
    }, 

代碼(有趣的部分,無論如何,我會留下什麼如一飲而盡有助於讀者的想象):

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); 
}); 

出於某種原因,移動更多的代碼到一飲而盡似乎讓構建永遠不會在團隊中完成。但這裏是我在本地使用的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); 
}); 
+0

這不是所有的時間,我真的希望我能想到另一種方式來做到這一點。 –

相關問題