Recharts 怎么跑变异测试?test-mutation 的耗时控制与单文件运行
2026/9/13 18:57:54 网站建设 项目流程

Recharts 怎么跑变异测试?test-mutation 的耗时控制与单文件运行

【免费下载链接】rechartsRedefined chart library built with React and D3项目地址: https://gitcode.com/GitHub_Trending/re/recharts

Recharts 仓库内置了基于 Stryker 的变异测试(mutation testing),但官方文档反复强调:全量变异测试可能运行数小时。如果你在本地改动了某个模块的代码,想用变异测试验证测试用例的变异杀伤能力,就需要知道怎么把范围缩小到单个文件或单个目录、大概要等多久、以及结果去哪里看。本文基于仓库中的 DEVELOPING.md、CONTRIBUTING.md、stryker.config.mjs 和 vitest.config-mutation.mts 整理出一条可照做的操作路径。

准备:安装依赖即可,无需额外搭建

变异测试不需要 Docker 或构建产物,走的是普通 Node 环境。按照 DEVELOPING.md 的环境准备流程:

git clone https://github.com/recharts/recharts.git cd recharts npm install

Node 版本以仓库中的.nvmrc文件为准。Windows 用户如果npm install@codecov/bundle-analyzer只支持 Linux/Darwin 而失败,用npm install --force继续即可。

控制耗时的关键:先收窄mutate范围

耗时问题出在变异测试的扫描范围上。仓库中 stryker.config.mjs 当前的mutate配置只包含一个文件:

mutate: ['src/theme/useBackwardsCompatibleTheme.ts'],

DEVELOPING.md 给出的耗时参考:

  • 全量变异测试「may take several hours」(可能耗时数小时);
  • 先把mutate属性设置为某个具体的文件或目录后再跑,「That may take 5-10 minutes」(约 5–10 分钟);
  • CONTRIBUTING.md 的说法是「A single file will take 15 minutes or more」——单文件至少 15 分钟起。

两处对单文件耗时的估计不一致(5–10 分钟 vs 15 分钟起),实际耗时取决于该文件被多少测试用例覆盖以及机器性能,按「以小时计的量级」预留时间更稳妥。

所以操作顺序是:先编辑 stryker.config.mjs,把mutate改成你要测的文件或目录,再执行命令

npm run test-mutation

该脚本在 package.json 中定义,等价于stryker run。Stryker 会读取stryker.config.mjs,其中关键项:

  • testRunner: 'vitest',并指定vitest: { configFile: 'vitest.config-mutation.mts' }——变异测试专用测试配置与日常npm run test用的是不同的 vitest 配置文件;
  • coverageAnalysis: 'perTest'
  • checkers: ['typescript'],即每个变异体都会经过 TypeScript 类型检查,typescriptChecker开启了prioritizePerformanceOverAccuracy: true
  • reporters: ['html', 'clear-text', 'progress', 'json']

如果你只是想快速缩小范围、跳过类型检查这一层开销,package.json 里还有一个现成脚本:

npm run test-mutation-file -- <要变异的文件路径>

它展开为stryker run --checkers "" --incremental --mutate <你的文件>。注意:仓库文档只对npm run test-mutation做了说明,没有解释test-mutation-file三个参数的具体语义,命令形态以上述脚本定义为准,参数含义以 Stryker 自身文档为准,不要凭名字猜测。

理解 vitest.config-mutation.mts:为什么有些测试不在变异运行里

变异测试用的 vitest.config-mutation.mts 与日常单测配置不同,有两点值得注意:

  1. 文件头部注释写明「Stryker doesn't allow multi-project vitest configs yet」,因此这里是一份单项目配置(日常npm run test走的是vitest.config.mts的多项目配置)。
  2. exclude列表中除了常规的**/www/****/scripts/**等目录,还显式排除了两个文件:
test/component/Tooltip/Tooltip.payload.spec.tsx test/chart/Treemap.spec.tsx

注释说明这两个测试「time out when running inside stryker, not sure why」——在 Stryker 里会超时,原因不明。也就是说,如果你的代码改动与 Tooltip payload 或 Treemap 相关,变异测试并不会用这两个 spec 来裁决变异体,评估结果时要意识到这一覆盖缺口。

该配置还固定process.env.TZ = 'UTC',测试在jsdom环境下运行,setup 文件包括test/vitest.setup.ts等,与日常单测保持一致。

执行与查看结果

范围收窄后执行npm run test-mutation,结果有两个出口,CONTRIBUTING.md 的说明:

  • 控制台直接输出测试结果(对应clear-text/progressreporter);
  • HTML 报告生成在仓库根目录的./reports文件夹。

DEVELOPING.md 的「Autogenerated code」一节也确认:npm run test-mutation会生成reports——mutation testing report。跑完后打开reports下的 HTML 报告即可逐变异体查看存活/被杀情况。

限制与边界

  • 变异测试不在 CI 中运行(DEVELOPING.md 原文:「Mutation tests do not run in CI」),它完全是本地行为,PR 流程不会因为变异测试被阻塞。
  • 全量跑耗时以小时计,CONTRIBUTING.md 建议的运行方式是更新stryker.config.mjs中的文件清单后再执行,不要把「一次跑全量」当作日常手段。
  • 改动mutate范围只是本地配置调整,提交 PR 时是否需要还原该配置,仓库文档没有明确要求,按你团队的贡献约定处理即可。

下一步

如果变异测试暴露出存活的变异体(说明现有测试没有覆盖到该行为),修复方式是补测试而不是改 Stryker 配置:单测集中在test目录,运行方式为npm run testnpm run test -- path/to/TestFile.spec.tsx(见 DEVELOPING.md 的「Running unit tests」一节),补完后把目标文件重新放入mutate再跑一轮即可。

【免费下载链接】rechartsRedefined chart library built with React and D3项目地址: https://gitcode.com/GitHub_Trending/re/recharts

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询