如何使用“ng e2e”针对节点服务器而不是 webpack-dev-server 运行量角器测试

fis*_*tte 4 node.js npm protractor angular-cli angular

使用 webpack-dev-server 对 prod 包运行 e2e 测试

在 Angular 中,可以使用以下命令针对 prod 构建运行量角器测试

"e2e:prod": "ng e2e --prod" 
Run Code Online (Sandbox Code Playgroud)

这将构建 prod 包,启动 webpack-dev-server 并运行量角器。一旦完成,webpack-dev-server 将被关闭。无论如何,这不是我们正在寻找的......见下文

量角器完成后如何关闭节点服务器?

对于我们的持续集成,我们希望 e2e 测试针对节点服务器而不是 webpack-dev-server 运行。所以我们尝试启动节点服务器,然后运行量角器测试。

为此,我们在我们的 ci 服务器执行的 package.json 中引入了一个新脚本:

npm run e2e:ci
Run Code Online (Sandbox Code Playgroud)

解决方案 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="
Run Code Online (Sandbox Code Playgroud)

这个解决方案几乎有效。有--dev-server-target=没有目标将停止角度打造束(我们对角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
Run Code Online (Sandbox Code Playgroud)

由于我将并发与-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",
Run Code Online (Sandbox Code Playgroud)

但是一旦量角器完成,这将使服务器运行。所以 e2e 测试永远不会停止。

有人知道如何正确执行此操作吗?要么优雅地关闭节点服务器,要么使用另一种方法来对节点服务器运行 e2e 测试进行归档?

fis*_*tte 5

好的,我们终于想出了让它运行的方法npm-run-all -r,至少在 linux 下。我们的 express 服务器需要监听 SIGTERM 信号。一起来:

包.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="
Run Code Online (Sandbox Code Playgroud)

服务器.js

var app = express();
var server = require('http').createServer(app);
server.listen(8080);

process.on('SIGTERM', function () {
    server.close(function () {
        process.exit(0);
    });
});
Run Code Online (Sandbox Code Playgroud)