服务端阅读 02026年5月31日 15:55
Jest 中 describe、test 和 it 该怎么分工?
describe 负责分组,test 和 it 负责定义具体用例;test 与 it 在 Jest 里是同一个能力,只是表达风格不同。写测试时不要把 describe 当成必填包装,也不要为了层级好看一层套一层。好的组织方式是让读者从外层看到模块或场景,从内层看到行为,再从断言里确认结果。简单说,describe 管上下文,test/it 管一个可以独立失败的事实。很多测试文件难维护,不是因为 Jest API 难,而是命名和分组把问题藏起来了。比如 describe('utils') 下面放几十个用例,失败时只能知道 utils 坏了,却不知道是格式化、校验还是边界值坏了。反过来,如果每个分支都新开一层 describe,文件会像迷宫,读者要上下跳着看 beforeEach。好的组织方式应该让失败标题连起来就是一句清楚的话。describe('Calculator.add', () => { test('adds two positive numbers', () => { expect(add(2, 3)).toBe(5); }); it('handles negative numbers', () => { expect(add(-2, 3)).toBe(1); });});追问test 和 it 到底有没有功能差异?没有,it 是 test 的别名,超时参数、异步测试、skip、only 等能力都一样。区别主要是可读性:it('returns empty array') 读起来像行为描述,test('returns empty array') 更直白。团队里最好统一一种风格,否则同一个文件里混着写会显得很乱。边界是 BDD 风格明显的组件行为测试可以用 it,工具函数或数据结构测试用 test 也很自然。取舍不是谁更高级,而是谁能让失败信息更像人话。describe 应该嵌套几层才合适?通常一到两层就够了,外层放模块名或组件名,内层放方法、状态或场景。三层以上会让测试标题很长,失败输出也不容易快速定位。嵌套太深还容易把共享变量塞进外层,最后不同用例之间互相影响。更稳的做法是把复杂场景拆成多个文件,或者用清晰的测试数据工厂代替深层 describe。如果一个 describe 下面只有一个测试,也要警惕它是不是只是为了凑结构。beforeEach 放在 describe 里有什么坑?beforeEach 适合做重复但便宜的初始化,比如创建 store、清空 mock、挂载轻量组件。不要在里面做慢请求、真实数据库连接或复杂全局配置,否则每个用例都会付一次成本。更隐蔽的坑是外层 beforeEach 和内层 beforeEach 叠加后,读者很难知道一个用例运行前到底发生了什么。只要初始化逻辑超过几行,就应该考虑抽成 setup(),让每个测试自己显式调用。这个取舍会让测试多写一行,但换来的是用例输入更清楚。一个 test 里可以写多个 expect 吗?可以,但多个断言应该服务于同一个行为。比如“登录成功后写入 token、更新用户信息、关闭 loading”属于一个完整结果,可以放在同一个用例里。若断言覆盖了多个原因不同的分支,失败时就很难判断到底是哪段逻辑坏了。取舍标准是:如果其中一个断言失败后,其他断言仍然代表独立需求,就拆成多个测试。另一个边界是异步流程,多个 expect 之间如果依赖执行顺序,就要确保前面的 await 已经真正结束。skip、only 和 todo 应该怎么用?test.only 和 describe.only 只适合本地临时调试,不能进入主分支。skip 可以用于记录暂时无法运行的用例,但要写清楚原因,否则它会变成永久漏测。todo 适合先标记测试计划,尤其是修 bug 前先列出缺失场景。团队踩坑最多的是忘删 .only,建议开启 eslint-plugin-jest 的 no-focused-tests 和 no-disabled-tests 规则。边界是迁移期的大量失败用例,可以短期 skip,但要配 issue 或过期时间,否则它们很快没人敢动。写段配置// eslint.config.jsmodule.exports = { plugins: ['jest'], extends: ['plugin:jest/recommended'], rules: { 'jest/no-focused-tests': 'error', 'jest/no-disabled-tests': 'warn', 'jest/expect-expect': 'error' }};组织 Jest 测试时,目标不是把层级写得像目录树,而是让失败信息能直接说明哪个行为坏了。describe 少而准,test/it 小而独立,再配合必要的 lint 约束,测试文件会比单纯追求“格式统一”更好维护。代码评审时也可以顺手看测试标题:如果只读标题看不懂行为,后面的人排查失败时也一样看不懂。