用途
本技能用于指导在 bklit-ui 仓库中添加单元测试,核心立场是:更少、更高信号的测试。在提议或编写测试之前应先阅读本技能,避免为了覆盖率或“周全”而添加低价值测试。
何时添加测试
当测试能够锁定那些容易被静默破坏的行为时,应当添加测试。资料中列出以下值得测试的情形:
- 纯函数 / 模块:输入输出稳定,速度快,无需 DOM。
- 格式化器、解析器、缩放数学、边界值:字符串/数字输出的回归对用户可见。
- 代码生成 / 导出 / 注册表辅助函数:输出形状即契约。
- 不明显的边界情况:空数据、反向区间、钳制(clamping)。
仓库中的示例包括:chart-formatters.test.ts、highlight-segment-bounds.test.ts、animation.test.ts、apps/web/lib/studio/tests/*。
何时不应添加测试(除非用户明确要求)
不要仅仅为了提高覆盖率或“更周全”而添加测试。资料中列出以下应跳过的情形:
- React 组件渲染冒烟测试:visx、motion、portal 等导致测试脆弱;手动/文档检查成本更低。
- memo() / guard 提取(#65 风格):属于结构性性能重构,输出未变,RTL 挂载断言过重。
- 默认 prop 透传:如 formatValue = intFmt,类型和格式化器测试已覆盖。
- 第三方库行为:不要重新测试 d3、visx 或 React。
- 琐碎的 getter / 单行包装器:没有回归信号。
- 整个图表 SVG/JSX 的快照:变更频繁,信号低。
如果用户问“我们应该测试 X 吗?”,当 X 属于上述表格时,应回答“不”,并建议更轻量的替代方案(纯辅助函数测试、手动检查、CI 构建)。
使用方式
运行器:Node 内置测试运行器加 tsx(除非仓库后续采用,否则不用 Jest/Vitest)。
命令:
pnpm test # root — turbo runs packages with a test script
pnpm --filter @bklitui/ui test
cd apps/web && pnpm test
测试文件位置:/tests//*.test.ts,紧邻被测代码。
测试模式示例:
import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { myFn } from "../my-module";
describe("myFn", () => {
it("handles empty input", () => {
assert.equal(myFn([]), expected);
});
});
等价性测试(格式化器首选):断言共享模块输出与之前的行内调用一致(例如使用相同 locale/options 的 toLocaleDateString),使测试保持时区安全,并证明没有视觉回归。
新包的测试脚本:在 package.json 中添加:
"test": "node scripts/run-tests.mjs"
使用一个小的 scripts/run-tests.mjs,从 tests 收集 *.test.ts,并调用 node --import tsx --test —— shell glob 在 Linux CI 上会失效。如果缺失,将 tsx 添加为 devDependency。接入根 turbo.json 的 test 任务;CI 运行 pnpm test。
编写前决策清单
- 逻辑是否纯粹或可提取为纯函数?→ 测试它。考虑先提取。
- 测试是否会因真实的用户可见 bug 而失败?→ 好候选。
- 是否需要 jsdom / RTL / Playwright?→ 停下;向用户说明理由或推迟到手动/视觉检查。
- 用户是否要求测试?→ 仍然应用本技能;不要过度交付。
- 多少个用例?→ 3–10 个聚焦用例,而非穷尽矩阵。
向用户说明什么
推荐测试时要明确:
- 添加:“测试 chart-formatters.ts —— 纯函数,回归价值高。”
- 跳过:“跳过 memo 拆分的组件测试 —— 输出无变化;构建加手动图表文档就足够了。”
- CI:在添加或更改测试时,在 PR 测试计划中提及 pnpm test。
反模式
- 未经团队同意就为一次性需求添加 Jest/Vitest/Testing Library。
- 模拟整个图表上下文以断言 useMemo 调用次数。
- 测试实现细节(hook 顺序、内部组件名称)。
- 重复类型检查器的工作(expect(typeof x).toBe('function'))。
- 提交因硬编码时区/locale 字符串而只能在本地通过的测试。
适用场景与限制
本技能适用于 bklit-ui 仓库中的单元测试编写与评审,帮助开发者判断哪些内容值得测试、哪些应跳过,并遵循仓库既定的运行器与文件组织约定。限制方面:资料未提供该技能在其他仓库、其他语言或框架中的适用性说明;未提供收费、价格、平台等商业信息;未提供除上述示例外的更多测试用例或工具支持。