Jest端到端测试:describe块传值、动态标题及执行顺序疑问
问题解答
一、动态标题实现方案
你遇到的标题变量不更新问题,根源在于Jest的执行流程:所有describe和it块会先被解析(测试收集阶段),之后才会执行测试代码(测试执行阶段)。模板字面量在解析阶段就会求值,此时topVar还是初始值-1,所以标题不会更新。
针对it块标题
可以把it的标题改成函数形式,Jest会在测试执行时调用这个函数,此时变量已经被赋值:
describe('top most', () => { let topVar = -1; describe('first nested', () => { it('get first response', async () => { const res = await request('/call'); topVar = res.body.user_id; // 赋值为1001 }); }); describe('get values for user', () => { // 用函数返回标题,执行时topVar已更新 it(() => `get the values for the user with id ${topVar}`, async () => { const res = await request(`/user?user_id=${topVar}`); expect(res.body.user_id).toBe(1001); }); }); });
针对describe块标题
由于describe在收集阶段就会被处理,无法使用测试执行时才生成的动态值(比如接口返回的user_id)。如果必须在describe标题中体现该值,只能提前同步获取数据(但e2e测试的接口请求是异步的,这种方式不可行),或者改用静态标题+动态it标题的组合。
二、describe和it的执行顺序
describe块:在测试收集阶段按代码从上到下的顺序执行,仅用于分组和定义测试结构,不会执行测试逻辑。it块:在测试执行阶段,同一文件内的it会按定义顺序从上到下依次执行(默认是串行,除非使用test.concurrent)。嵌套的describe块中的it会按嵌套顺序被收集并执行。
三、--runInBand参数的作用
--runInBand是控制多测试文件的执行方式:
- 默认情况下,Jest会启动多个进程并行执行不同的测试文件,提升速度。
- 使用
--runInBand后,Jest会在单个进程中串行执行所有测试文件,即一个文件测试完成后再执行下一个。 - 该参数不影响单个文件内的测试执行顺序,单个文件内的
it默认就是串行执行的。
内容的提问来源于stack exchange,提问作者juztcode
相关产品推荐
相关产品推荐

