如何在cucumberjs+playwright测试前启动Angular的ng serve并自动关停
CucumberJS + Playwright 测试启停Angular应用方案
完全可以实现你要的效果,以下是两种常用落地方式:
方案1:通过Cucumber全局钩子实现启停
这种方式和测试流程绑定最紧,启停逻辑统一维护在测试代码中:
- 首先安装依赖:
npm install tree-kill wait-on -Dtree-kill用于完整关停ng serve启动的嵌套子进程,避免出现端口残留占用问题wait-on用于检测Angular应用是否启动完成,避免测试提前执行报错
- 在Cucumber的钩子文件(通常为
features/support/hooks.js)中添加全局启停逻辑:
const { BeforeAll, AfterAll, setDefaultTimeout } = require('@cucumber/cucumber'); const { spawn } = require('child_process'); const kill = require('tree-kill'); const waitOn = require('wait-on'); // 调整默认超时适配ng serve的启动耗时,可根据实际情况调整 setDefaultTimeout(120000); let ngServeInstance; BeforeAll(async () => { // 启动带测试配置的Angular服务,--configuration后的参数替换为你实际的测试配置名 ngServeInstance = spawn('ng', ['serve', '--configuration', 'test'], { stdio: 'inherit', // 不需要看ng serve日志的话可以改为'ignore' shell: process.platform === 'win32' // 兼容Windows系统的命令执行 }); // 等待应用启动完成,地址替换为你实际的Angular服务访问地址 await waitOn({ resources: ['http://localhost:4200'] }); }); AfterAll(async () => { // 所有测试执行完成后关停Angular服务 if (ngServeInstance) { await new Promise((resolve) => kill(ngServeInstance.pid, 'SIGTERM', resolve)); } });
方案2:通过npm脚本实现,和测试逻辑解耦
这种方式不需要修改测试代码,通过脚本命令串起整个流程:
- 安装跨平台工具依赖:
npm install wait-on cross-env kill-port -D - 修改
package.json中的scripts配置:
{ "scripts": { "start:test": "ng serve --configuration test", "test:cucumber": "cucumber-js", "test:e2e": "cross-env START_SERVER=true npm run start:test & wait-on http://localhost:4200 && npm run test:cucumber && npx kill-port 4200" } }
Windows系统下后台运行命令如果失效,可以把
npm run start:test &替换为start /B npm run start:test,或者安装concurrently包实现跨平台的多进程管理。
特殊场景补充
如果你是通过Playwright Test Runner来运行Cucumber用例,可以直接复用Playwright内置的webServer能力,不需要额外写钩子逻辑,配置示例如下:
// playwright.config.js const { defineConfig } = require('@playwright/test'); module.exports = defineConfig({ webServer: { command: 'ng serve --configuration test', url: 'http://localhost:4200', reuseExistingServer: !process.env.CI, timeout: 120000 }, // 其余Playwright配置项 });
内容的提问来源于stack exchange,提问作者Waldemar
相关产品推荐
相关产品推荐

