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

文件中有这样一句玩笑话: “ Jest 对 JavaScript 环境进行虚拟化,并在工作进程之间并行运行测试。”

但是,如果在一个文件中有多个测试,它们是并行运行的,还是仅仅应用于测试文件?我可以假设一个文件中的测试按照外观和顺序运行吗?

53253 次浏览

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

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

2020年的玩笑

为了添加更多关于这方面的信息,async测试在 describe()语句内的 < em > 系列 中运行。这对 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()语句将并行执行,即使它们在同一个文件中。

如果想在一个文件中并行运行它们,那么可以使用 test.concurrent('test run concurrently', () => { ... }),因为它们运行速度太慢。这是一个有点错误,没有很好的文档,但至少有一个办法那里。

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

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

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

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

jest --runInBand

档号: 开玩笑的

奇怪的是,在我的 M1Mac 上顺序运行测试会完成得更快,这对您的用例来说是更好的测试