You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在cucumberjs+playwright测试前启动Angular的ng serve并自动关停

CucumberJS + Playwright 测试启停Angular应用方案

完全可以实现你要的效果,以下是两种常用落地方式:

方案1:通过Cucumber全局钩子实现启停

这种方式和测试流程绑定最紧,启停逻辑统一维护在测试代码中:

  • 首先安装依赖:npm install tree-kill wait-on -D
    • tree-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:27:01