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

如何获取Cypress创建的测试列表及Angular项目中的测试名称?

嘿,刚好有几个实用的法子能帮你搞定Cypress+Angular栈下的测试列表提取,不管是要在测试运行时收集还是静态解析文件,都能实现,一起来看:

方法一:利用Cypress运行时事件实时收集测试名称

这个方法适合你需要在测试运行过程中,同时拿到测试名称和运行状态(成功/失败/跳过)的场景,完全适配Angular的测试环境。

首先在你的cypress/support/e2e.js(如果是旧版Cypress,对应cypress/support/index.js)里添加这段代码:

// 初始化数组存储所有测试信息
const testResults = [];

// 监听describe(测试套件)开始运行的事件
Cypress.on('suite:before:run', (suite) => {
  testResults.push({
    type: 'suite',
    name: suite.title, // 就是你写的describe标题
    tests: [] // 用来存这个套件下的所有it用例
  });
});

// 监听it(测试用例)运行完成的事件
Cypress.on('test:after:run', (test, runnable) => {
  // 找到当前用例所属的套件
  const currentSuite = testResults.find(item => item.name === runnable.parent.title);
  if (currentSuite) {
    currentSuite.tests.push({
      name: test.title, // it的标题
      status: test.state // 测试状态:passed/failed/pending
    });
  }
});

// 所有测试跑完后,输出结果并保存到文件
Cypress.on('run:after:run', () => {
  console.log('完整测试列表:', JSON.stringify(testResults, null, 2));
  
  // 调用自定义task把结果写入文件
  cy.task('saveTestResults', testResults);
});

接下来需要在cypress.config.js(Cypress 10+的配置文件,旧版是cypress.json对应配置)里添加一个自定义Node任务,用来写入文件:

const { defineConfig } = require('cypress');
const fs = require('fs');

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      // 注册保存测试结果的task
      on('task', {
        saveTestResults(results) {
          fs.writeFileSync('./test-results.json', JSON.stringify(results, null, 2));
          return null;
        }
      });
    },
    // 这里可以加上你的Angular相关配置,比如baseUrl之类的
    baseUrl: 'http://localhost:4200'
  },
});

运行测试后,项目根目录就会生成test-results.json,里面清晰列出所有describe和it的名称,还有每个测试的运行状态。

方法二:用Node.js脚本静态解析测试文件

如果你不想运行测试,只想快速提取所有测试文件里的describe和it名称,这个方法更高效,毕竟Angular的测试文件都是规范的.spec.ts格式。

首先安装必要的依赖:

npm install @babel/parser @babel/traverse --save-dev

然后在项目根目录创建一个extract-tests.js脚本:

const fs = require('fs');
const path = require('path');
const parser = require('@babel/parser');
const traverse = require('@babel/traverse').default;

// 配置要扫描的测试文件路径,Angular的组件测试一般在src/app下
const testDir = path.join(__dirname, 'src/app');

// 递归读取所有.spec.ts文件
function readTestFiles(dir, fileList = []) {
  const files = fs.readdirSync(dir);
  files.forEach(file => {
    const filePath = path.join(dir, file);
    if (fs.statSync(filePath).isDirectory()) {
      readTestFiles(filePath, fileList);
    } else if (file.endsWith('.spec.ts')) {
      fileList.push(filePath);
    }
  });
  return fileList;
}

// 解析单个测试文件,提取describe和it的名称
function parseTestFile(filePath) {
  const content = fs.readFileSync(filePath, 'utf8');
  // 解析TypeScript代码成AST语法树
  const ast = parser.parse(content, {
    sourceType: 'module',
    plugins: ['typescript', 'jsx']
  });

  const testData = {
    file: filePath,
    suites: []
  };

  // 遍历AST树,找到describe和it调用
  traverse(ast, {
    CallExpression(path) {
      // 匹配describe/fdescribe/xdescribe(聚焦/跳过的套件)
      if (['describe', 'fdescribe', 'xdescribe'].includes(path.node.callee.name)) {
        const suiteName = path.node.arguments[0].value;
        const suite = {
          name: suiteName,
          tests: []
        };

        // 遍历describe回调里的内容,找到it/xit/fit
        path.node.arguments[1].body.body.forEach(node => {
          if (node.type === 'ExpressionStatement' && ['it', 'xit', 'fit'].includes(node.expression.callee?.name)) {
            const testName = node.expression.arguments[0].value;
            suite.tests.push(testName);
          }
        });

        testData.suites.push(suite);
      }
    }
  });

  return testData;
}

// 主函数:执行解析并输出结果
function main() {
  const testFiles = readTestFiles(testDir);
  const allTests = testFiles.map(file => parseTestFile(file));
  
  // 控制台输出结果
  console.log(JSON.stringify(allTests, null, 2));
  
  // 保存到文件
  fs.writeFileSync('./all-tests.json', JSON.stringify(allTests, null, 2));
  console.log('✅ 测试列表已保存到all-tests.json');
}

main();

运行这个脚本:

node extract-tests.js

很快就能得到所有测试文件里的describe和it名称,包括跳过的xdescribe和xit,完全不需要启动测试服务。

小提示
  • 如果你用的是Cypress 10+,记得配置文件是cypress.config.js,旧版的cypress.json已经不再使用啦。
  • 方法二中的testDir可以根据你的项目结构调整,比如如果有单独的E2E测试,路径改成cypress/e2e即可。
  • 要是你还需要提取测试的其他信息(比如测试代码行数、注释),可以在方法二的AST遍历逻辑里继续扩展。

内容的提问来源于stack exchange,提问作者Caro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:30:13