ChatGPT解决这个技术问题 Extra ChatGPT

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

文档中的 Jest 状态:“Jest 虚拟化 JavaScript 环境并跨工作进程并行运行测试。”

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


m
mikemaccana

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

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


嗯,问题是,当测试是 async 函数时,beforeEachafterEach 在各种情况下都没有用,因为如果 Jest 并行运行 async 测试,则不再可能重置在每次测试后进行状态或清理,这会使测试很容易出现错误。 beforeEachafterEach 用于在测试之间设置或清理,为了使这有意义,测试需要串行执行,而不是并行执行。 Jest(或任何运行程序)并行运行 async 功能测试将是一个糟糕的 API 设计......
顺便说一句,@trusktr Jest 确实并行运行测试,而不是在同一个文件中。因此,如果它们在同一个数据库上运行,您可能会遇到测试之间的干扰问题。
@JaimeSangcap 我们目前为每个测试套件使用不同的数据库。在 jest 配置中,我们有 setupFiles: ['<rootDir>/src/testing/integration/targetRandomDatabase.js'],,在 targetRandomDatabase.js 中,我们每次设置一个随机的新数据库 URL。设置文件为每个测试套件单独运行,因此可以防止干扰。我们使用 mongodb-memory-server 为每次运行 jest 运行一个新的 mongodb,因此数据库会被自动丢弃。
@JaimeSangcap 抱歉,我搬到了 Karma。
--runInBand CLI 标志防止 jest 并行运行文件
B
Ben Winding

2020年的笑话

为了在这方面添加更多信息,async 测试在 describe() 语句的 series 中运行。这对于 IO/数据库设置和清理功能很有用。看看下面的例子:

一些.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() 语句将并行执行,即使它们在同一个文件中。


“尽管多个 describe() 语句将并行执行,即使它们在同一个文件中。”,我在一个测试文件中尝试了两个 describe(),第一个 describe 有一个异步测试用例,但发现它们执行在系列中。
我错误地认为 describe 语句是最高级别,我猜每个文件的测试都是按顺序执行的,而不管 describe 包装器如何
K
Klesun

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

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


这是在哪里记录的?
此外,当测试超时时会调用 afterAll,但异步代码将完成执行,因此如果您在 afterAll 中执行操作,例如断开数据库连接,您可能会收到与后续测试混合的错误消息。您可以通过使用 --bail 1 调用 jest 来解决此问题
L
LeOn - Han Li

如果您想在一个文件中并行运行它们太慢,您可以使用 test.concurrent('test run concurrently', () => { ... })。它有点错误并且没有很好的文档记录,但至少有一种方法。

我注意到的一件事是它不会等待 beforeAll() 中的 async 内容,因此您需要一些自己的技巧(例如 setInterval 等待)以使其按预期工作。


A
Ali80

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

jest --runInBand

参考:jest docs

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


这没有回答问题。 OP 询问测试是否在一个文件中而不是在不同的文件中是否按顺序运行,在这种情况下,它应该默认并行运行,如 JEST 文档中所述。
@Sphinx问题似乎是在寻找一种方法来确保测试至少在一个文件中按顺序运行,我也在寻找同样的东西!