Jest 是单独导入每个测试文件,还是在执行前一次安装所有引用?

Mik*_*e K 5 javascript jestjs

我有几个单元测试,每个模块通过一个方法从一个 JSON 文件中导入大量数据资源。这个 IIFE 方法由每个测试模块导入,我试图弄清楚为什么我的测试如此缓慢。JSON 数据量很大,所以我猜测之所以会出现这种情况,是因为每个测试在运行时都会导入大量数据。如果是这种情况,我将不得不修改该方法,以仅返回特定的数据集。

所以我的问题是,每个测试模块每次运行时都会导入数据,还是只在我执行时导入一次npm run test

我拥有的结构的一个基本示例: Codesandbox。说test1.js只需要dataset_1数据 json 中的密钥,其他两个测试文件需要dataset_2. 编写一个将所需数据道具返回到调用它的测试文件的方法会更高效,还是无关紧要?尽我所能正确表达这个问题,请让我知道我还能澄清什么。

dap*_*azz 6

是的,我认为你需要更新你的测试。这就是文档在resetModules配置开关部分所说的:

...每个测试文件都有自己独立的模块注册表。

这与我观察到的行为相符。对于每个测试文件,整个运行时都会重新构建,这意味着所有模块都是从头开始导入的。这是有道理的,因为这意味着与未在测试之间清理的可变全局状态相关的常见测试错误被根除。

此外,值得注意的是 jest 可以(如果并非总是如此)使用子进程来运行每个测试,以便可以更轻松地对其进行并行化,这也是为每个测试文件进行全新设置有意义的另一个原因。您可以使用 关闭此功能--runInBand,但这不会改变行为,请参见下面的示例。

在默认安装中,您可以通过简单地console.log()在导入文件中放置一个语句,然后让两个测试导入它来查看问题,例如:

mylib.js

console.log('Hello from mylib.js!');
Run Code Online (Sandbox Code Playgroud)

笑话/test1.js

const mylib = require('../mylib');
describe('test1', () => {
  it('should be equal', () => {
    expect(1).toEqual(1);
  });
});
Run Code Online (Sandbox Code Playgroud)

笑话/test2.js

const mylib = require('../mylib');
describe('test2', () => {
  it('should be equal', () => {
    expect(2).toEqual(2);
  });
});
Run Code Online (Sandbox Code Playgroud)

我得到的输出如下:

 3.2: npm run jest -- --runInBand jests/test*

> fgamelib@0.1.0 jest /path/to/cwd
> jest "jests/test1.jest.js" "jests/test2.jest.js"

(node:60746) ExperimentalWarning: The fs.promises API is experimental
 PASS  jests/test1.jest.js
  ? Console

    console.log
      Hello from mylib.js!

      at Object.<anonymous> (mylib.js:1:9)

 PASS  jests/test2.jest.js
  ? Console

    console.log
      Hello from mylib.js!

      at Object.<anonymous> (mylib.js:1:9)


Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.075 s
Ran all test suites matching /jests\/test1.jest.js|jests\/test2.jest.js/i.
Run Code Online (Sandbox Code Playgroud)