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

Jar*_*rda 25 jestjs

Jest在文档中指出:"Jest虚拟化JavaScript环境并在工作进程之间并行运行测试."

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

Ben*_*ing 26

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);
});
Run Code Online (Sandbox Code Playgroud)

输出:

> setup test
-- starting test 1
-- finished test 1
< teardown test
> setup test
-- starting test 2
-- finished test 2
< teardown test
Run Code Online (Sandbox Code Playgroud)

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

  • “多个describe()语句将并行执行,即使它们位于同一个文件中。”,我在一个测试文件中尝试了两个`describe()`,第一个`describe`有一个异步测试用例,但发现他们连续执行。 (3认同)
  • 我错误地认为“describe”语句是最高级别的,我猜每个文件的测试都是串行执行的,而不管“describe”包装器如何 (2认同)

ris*_*ott 23

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

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

  • 好吧,问题是,当测试是'async`函数时,`beforeEach`和`afterEach`在各种情况下都是无用的,因为如果Jest要并行运行`async`测试,那么它就不再可能重置了在每次测试后陈述或清理,这将使测试非常容易出错.`beforeEach`和`afterEach`用于在测试之间建立或清理,为了使其有意义,测试需要串行执行,而不是并行执行.对于Jest(或任何跑步者)并行运行`async`功能测试来说,这将是一个糟糕的API设计... (16认同)
  • 顺便说一句@trusktr Jest DOES并行运行测试,而不是同一个文件中的测试.因此,如果测试在同一数据库上运行,则可能会遇到测试之间干扰的问题. (3认同)
  • @JaimeSangcap我们目前为每个测试套件使用不同的数据库.在jest配置中,我们有`setupFiles:['<rootDir> /src/testing/integration/targetRandomDatabase.js'],`和`targetRandomDatabase.js`我们每次都设置一个随机的新数据库URL.每个测试套件都单独运行安装文件,因此可以防止干扰.我们使用`mongodb-memory-server`为每次运行jest运行一个新的mongodb,因此数据库会自动丢弃. (2认同)
  • @JaimeSangcap对不起,我搬到了业力。 (2认同)
  • `--runInBand` CLI标志防止jest并行运行文件 (2认同)

Art*_*sun 18

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

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

  • 这是在哪里记录的? (2认同)

Ali*_*i80 10

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

jest --runInBand
Run Code Online (Sandbox Code Playgroud)

参考:笑话文档

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

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

LeO*_* Li 7

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

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

  • 这救了我的命!我的每个测试都在一个隔离的环境(一个单独的临时数据库)中运行,因此这确实加快了速度。特别是如果您考虑到每个测试运行 500 毫秒。 (2认同)