在 Jest 中,一个文件 运行 中的测试是并行的吗?

Are tests inside one file run in parallel in Jest?

Jest 在文档中指出: "Jest virtualizes JavaScript environments and runs tests in parallel across worker processes."

但是一个文件中的多个测试呢,它们是并行 运行 还是此语句仅适用于测试文件?我可以假设在一个文件 运行 中按出现顺序和顺序进行测试吗?

是的,您可以放心地假设单个文件中的测试将 运行 按出现顺序排列。您可以通过在每个 it 块中放置一个 console.log 来证明这一点。

可能值得一提的是,依赖执行顺序/外部状态通常是不好的做法......而且你永远不知道,Jest(或当前的底层测试 运行ner,Jasmine)可能会决定运行 在新版本中以随机顺序排列它们。

2020 年开玩笑

要对此添加更多信息,async 测试是 运行 in series inside describe() 语句。这对于 IO/Database 设置和清理功能很有用。看看下面的例子:

some.spec.js

describe("my asynchronous tests", () => {
  beforeEach(async () => {
    console.log('> setup test')
    // SOMETHING ASYNCHRONOUS
  });
  afterEach(async () => {
    console.log('< teardown test')
    // SOMETHING ASYNCHRONOUS
  });

  test("test 1", async () => {
    console.log('-- starting test 1');
    // SOMETHING ASYNCHRONOUS
    console.log('-- finished test 1');
  }, 100000);

  test("test 2", async () => {
    console.log('-- starting test 2');
    // SOMETHING ASYNCHRONOUS
    console.log('-- finished test 2');
  }, 100000);
});

输出:

> setup test
-- starting test 1
-- finished test 1
< teardown test
> setup test
-- starting test 2
-- finished test 2
< teardown test

多个 describe() 语句将并行执行,即使它们在同一个文件中。

如果你想test.concurrent('test run concurrently', () => { ... })你可以使用test.concurrent('test run concurrently', () => { ... })运行它们在一个文件中并行处理太慢了。它有点问题,而且没有很好的记录,但至少有办法。

我注意到的一件事是它不会等待 beforeAll() 中的 async 东西,所以你需要一些你自己的技巧(比如 setInterval 等待)来让它工作不出所料。

请注意,如果其中一个测试在 5 seconds 之后超时,您可能会同时获得两个测试 运行 的副作用 - jest 停止等待超时测试,但它的代码继续执行,与以下测试同时开玩笑。

(在我意识到这是导致我来到这里的副作用的原因之前拔了很多头发)

要使测试文件 运行 顺序使用 -i--runInBand 标志

jest --runInBand

参考:jest docs

奇怪的是,运行在我的 M1 Mac 上按顺序完成测试更快!,更好地测试您的用例