如何使用“ng e2e”对节点服务器而不是 webpack-dev-server 运行量角器测试
Posted
技术标签:
【中文标题】如何使用“ng e2e”对节点服务器而不是 webpack-dev-server 运行量角器测试【英文标题】:How to run protractor tests with "ng e2e" against node server instead of webpack-dev-server 【发布时间】:2019-04-25 01:25:21 【问题描述】:使用 webpack-dev-server 对 prod 包运行 e2e 测试
在 Angular 中,可以使用
对 prod 构建运行量角器测试"e2e:prod": "ng e2e --prod"
这将构建产品包,启动 webpack-dev-server 并运行量角器。一旦完成,webpack-dev-server 将被关闭。无论如何,这不是我们想要的……见下文
量角器完成后如何关闭节点服务器?
为了我们的持续集成,我们希望 e2e 测试针对节点服务器而不是 webpack-dev-server 运行。所以我们尝试启动节点服务器,然后运行量角器测试。
为此,我们在我们的 ci 服务器执行的 package.json 中引入了一个新脚本:
npm run e2e:ci
解决方案 1 - 同时使用(不起作用):
"e2e:ci": "concurrently -k \"npm:e2e:ci:serve\" \"npm:e2e:ci:protractor\"",
"e2e:ci:serve": "node server.js",
"e2e:ci:protractor": "ng e2e --base-url=http://localhost:8080/ --dev-server-target="
这个解决方案几乎可以工作。没有目标的--dev-server-target=
将停止 Angular 来构建捆绑包(我们在 Angular 7 上)。 e2e:ci:serve
启动节点服务器,假设 prod 包是之前构建的,因此可以提供服务。 但是 - 一旦量角器完成,它将终止节点服务器,因此它与代码 1 一起存在:
--> Sending SIGTERM to other processes..
[serve:server] npm run serve:server exited with code 1
npm ERR! code ELIFECYCLE
由于我使用了 -k
的并发(kill),所以一旦量角器完成,节点服务器就会停止。但是退出代码为 1,所以我们的 ci 假设 e2e 测试失败。
解决方案 2 - 使用 npm-run-all(不起作用)
我们还尝试了 npm-run-all 而不是与比赛标志-r
同时进行:
"e2e:ci": "npm-run-all -p -r e2e:ci:serve e2e:ci:protractor",
但是一旦量角器完成,这将使服务器继续运行。所以e2e测试永远不会停止。
有人知道如何正确执行此操作吗?是优雅地关闭节点服务器,还是另一种方法来归档针对节点服务器运行 e2e 测试?
【问题讨论】:
【参考方案1】:好的,我们终于想办法让它在npm-run-all -r
下运行,至少在 linux 下是这样。我们的快递服务器需要监听 SIGTERM 信号。一起来:
package.json
"e2e:ci": "npm-run-all -p -r e2e:ci:serve e2e:ci:protractor",
"e2e:ci:serve": "node server.js",
"e2e:ci:protractor": "ng e2e --base-url=http://localhost:8080/ --dev-server-target="
server.js
var app = express();
var server = require('http').createServer(app);
server.listen(8080);
process.on('SIGTERM', function ()
server.close(function ()
process.exit(0);
);
);
【讨论】:
以上是关于如何使用“ng e2e”对节点服务器而不是 webpack-dev-server 运行量角器测试的主要内容,如果未能解决你的问题,请参考以下文章
markdown Angular CLI:ng lint,ng test,ng e2e
Angular 测试因 ng e2e 失败,但使用量角器 conf.js 通过
AWS EC2 NGINX 节点服务器 - 如何使用 Https 而不是 Http
如何使用 MSI 而不是 Service Principal 来调用部署在 Azure 上的 Authenticate web api