如何使用“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

节点 Socket.io 链接如何在服务器而不是 localhost(wamp/xampp) 中提供

如何将 Javascript 对象转换为节点缓冲区?