面试题答案
一键面试Jest测试框架运行测试用例底层机制
- 发现测试文件:
- Jest默认会在
src
目录及其子目录下寻找测试文件。文件名通常遵循__tests__
文件夹命名约定,或者文件名以.test.js
、.spec.js
结尾。 - 例如,在项目结构
src/utils/__tests__/mathUtils.test.js
,Jest会识别mathUtils.test.js
为测试文件。这是通过配置中的testMatch
选项来指定匹配规则实现的,默认值为["**/__tests__/**/*.js?(x)", "**/?(*.)+(spec|test).js?(x)"]
。
- Jest默认会在
- 管理测试环境:
- 全局环境:Jest会为每个测试文件创建一个单独的JavaScript运行环境,类似浏览器环境,但实际上是基于Node.js的jsdom。它模拟了浏览器的DOM、BOM等对象,使得可以在Node.js环境中运行前端相关的测试。
- 测试用例级别:在每个测试用例执行前,Jest会自动重置测试环境,确保每个测试用例的独立性,避免相互干扰。例如,一个测试用例中对全局变量的修改不会影响到下一个测试用例。
- 执行断言:
- Jest提供了一套丰富的断言库,如
expect
。expect
接收一个实际值,然后可以通过链式调用各种匹配器(如toBe
、toEqual
等)来定义预期值。 - 例如,
expect(2 + 2).toBe(4)
,这里expect(2 + 2)
接收实际值4
,toBe(4)
定义预期值也是4
。如果实际值与预期值不匹配,测试用例会失败,并给出详细的错误信息,指出实际值和预期值的差异。
- Jest提供了一套丰富的断言库,如
大型项目中Jest测试运行速度慢的优化策略
- 并行测试:
- 原理:Jest支持并行运行测试用例,通过
--maxWorkers
选项(默认值为CPU核心数 - 1)来控制并行度。它会将测试文件分配到不同的worker进程中并行执行,充分利用多核CPU的性能。 - 适用场景:适用于测试用例之间相互独立,没有共享资源(如全局变量、数据库连接等)的场景。例如,单元测试中对不同模块的独立测试用例,并行执行可以显著提高测试速度。
- 原理:Jest支持并行运行测试用例,通过
- 缓存测试结果:
- 原理:Jest可以通过
--watchAll=false
选项关闭watch模式,并结合--cache
选项启用缓存。Jest会将测试结果缓存到项目根目录下的.jest
文件夹中。当文件没有变化时,直接使用缓存的测试结果,而不需要重新执行测试。 - 适用场景:在大型项目中,部分代码相对稳定,修改频率较低。对于这些代码的测试用例,缓存可以避免重复执行,提高测试效率。例如,一些基础工具函数的测试,只要工具函数代码不变,测试结果可以复用。
- 原理:Jest可以通过
- 使用测试覆盖率阈值:
- 原理:通过设置
coverageThreshold
选项,Jest可以在测试覆盖率达到设定阈值时才通过测试。这样可以避免不必要的测试用例执行,集中精力在关键代码的测试上。例如,如果设置coverageThreshold: { global: { statements: 80 } }
,只有当全局代码的语句覆盖率达到80%时测试才会通过。 - 适用场景:适用于大型项目中需要对核心业务逻辑有较高覆盖率要求的场景。可以优先保证重要代码的测试,而对于一些边缘情况或低风险代码,可以适当降低覆盖率要求,从而减少测试执行时间。
- 原理:通过设置