U-Boot 2024.04 深度解析:从SPL到内核移交的3个内存布局与重定位
2026/7/11 1:55:40
在自动化测试中,我们不仅关心用例能否通过,更想知道测试是否充分覆盖了业务代码。本文将带你使用Playwright和现代前端工具链,建立完整的测试覆盖率收集与报告体系。
当团队编写了大量测试用例后,一个自然的问题会出现:我们到底测了多少代码?覆盖率指标能直观反映测试的完整性,帮助识别未被测试的边界情况。对于核心业务逻辑,高覆盖率是质量信心的基础。
假设我们有一个基于TypeScript的前端项目,结构如下:
project/ ├── src/ │ ├── utils/ │ ├── components/ │ └── lib/ ├── tests/ │ ├── e2e/ │ └── unit/ └── package.json首先安装必要依赖:
npm install --save-dev @istanbuljs/nyc-config-typescript \ babel-plugin-istanbul \ source-map-supportPlaywright本身不直接计算覆盖率,我们需要借助Babel插件在运行时收集数据。
步骤1:配置Babel转换
// .babelrc { "plugins": [ ["istanbul", { "include": ["src/**/*.{js,jsx,ts,tsx}"], "exclude": ["**/*.test.*", "**/*.spec.*"] }] ] }步骤2:修改Playwright配置
// playwright.config.ts import { defineConfig } from'@playwright/test'; exportdefault defineConfig({ use: { baseURL: 'http://localhost:3000', }, webServer: { command: 'npm run dev', url: 'http://localhost:3000', reuseExistingServer: true, }, reporter: [ ['html', { outputFolder: 'playwright-report' }], ['json', { outputFile: 'coverage/coverage.json' }] ], });我们通过两个npm脚本配合完成收集工作:
// package.json { "scripts": { "test:coverage": "npm run test:collect && npm run test:report", "test:collect": "playwright test --reporter=json --output=coverage/raw", "test:report": "nyc report --reporter=html --reporter=text --reporter=lcov" } }实际执行时,我们使用这个定制测试脚本:
// tests/coverage-runner.js const { chromium } = require('playwright'); const fs = require('fs').promises; asyncfunction collectCoverage() { const browser = await chromium.launch(); const page = await browser.newPage(); // 开始收集覆盖率 awaitPromise.all([ page.coverage.startJSCoverage(), page.coverage.startCSSCoverage() ]); // 执行你的测试页面 await page.goto('http://localhost:3000'); // 运行测试套件 await page.evaluate(() =>window.runTests()); // 收集数据 const [jsCoverage, cssCoverage] = awaitPromise.all([ page.coverage.stopJSCoverage(), page.coverage.stopCSSCoverage() ]); // 保存原始数据 await fs.writeFile( 'coverage/coverage.json', JSON.stringify({ jsCoverage, cssCoverage }, null, 2) ); await browser.close(); }收集的原始数据需要转换为可读报告。我们使用Istanbul的nyc工具:
# .nycrc extends:"@istanbuljs/nyc-config-typescript" reporter: -html -text -lcov report-dir:coverage temp-dir:.nyc_output include: -src/**/*.{js,jsx,ts,tsx} exclude: -**/*.d.ts -**/*.test.* -**/*.spec.*运行报告生成:
npx nyc report --reporter=html这会在coverage目录生成完整的HTML报告。打开coverage/index.html,你会看到类似这样的结构:
.env、配置文件)和第三方代码应该从覆盖率统计中排除,避免干扰真实数据。import()),确保在测试中实际触发这些路径,否则它们不会被计入覆盖率。{ "nyc": { "branches": 80, "lines": 85, "functions": 80, "statements": 85 } }- name:Runtestswithcoverage run:npmruntest:coverage -name:Uploadcoveragereport uses:codecov/codecov-action@v3 with: file:./coverage/lcov.info高覆盖率不等于高质量测试。要特别注意:
我们的经验是:首先追求核心逻辑的高覆盖率,然后逐步完善工具类和辅助函数,最后处理UI组件。对于遗留系统,可以设置逐步提升的覆盖率目标,而不是一次性要求100%。