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

Posted

技术标签:

【中文标题】一个文件中的测试是不是在 Jest 中并行运行?【英文标题】:Are tests inside one file run in parallel in Jest?一个文件中的测试是否在 Jest 中并行运行? 【发布时间】:2017-02-11 10:03:29 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

好吧,问题是,beforeEachafterEach 在测试是 async 函数的各种情况下将毫无用处,因为如果 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 并行运行文件【参考方案2】:

2020 年的笑话

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

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

【讨论】:

" 多个 describe() 语句将并行执行,即使它们在同一个文件中。",我在一个测试文件中尝试了两个 describe(),第一个 describe 有一个异步测试用例,但发现它们是串行执行的。 我错误地认为describe 语句是***别,我猜每个文件的测试都是按顺序执行的,而不管describe 包装器【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

这是在哪里记录的?【参考方案5】:

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

jest --runInBand

参考:jest docs

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

【讨论】:

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

以上是关于一个文件中的测试是不是在 Jest 中并行运行?的主要内容,如果未能解决你的问题,请参考以下文章

WEB各类常用测试工具

有没有办法用 Jest 顺序运行一些测试?

ReferenceError:元素未定义。当我尝试运行 ios 测试时遇到此问题,以 jest 作为测试运行器反应本机

在 Jest 中的每个测试之前运行全局测试设置

指定 jest 测试文件目录

并行执行没有发生在Cucumber JVM 4.0.0和Junit测试运行器上