文档中的 Jest 状态:“Jest 虚拟化 JavaScript 环境并跨工作进程并行运行测试。”
但是一个文件中的多个测试呢,它们是并行运行的,还是这个语句只适用于测试文件?我可以假设一个文件中的测试按出现顺序和串行运行吗?
您可以放心地假设单个文件中的测试将按出现的顺序运行。您可以通过在每个 it
块中放置一个 console.log
来证明这一点。
可能值得一提的是,依赖执行顺序/外部状态通常是不好的做法……而且你永远不知道,Jest(或当前的底层测试运行器,Jasmine)可能会决定以随机顺序运行它们更新版本。
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
包装器如何
请注意,如果其中一个在 5 seconds 之后超时,您可能会得到两个并行运行的副作用 - jest 停止等待超时测试,但它的代码继续执行,与以下测试 jest 并行执行。
(在我意识到这是导致我来到这里的副作用的原因之前拔出了相当多的头发)
afterAll
,但异步代码将完成执行,因此如果您在 afterAll
中执行操作,例如断开数据库连接,您可能会收到与后续测试混合的错误消息。您可以通过使用 --bail 1
调用 jest 来解决此问题
如果您想在一个文件中并行运行它们太慢,您可以使用 test.concurrent('test run concurrently', () => { ... })
。它有点错误并且没有很好的文档记录,但至少有一种方法。
我注意到的一件事是它不会等待 beforeAll()
中的 async
内容,因此您需要一些自己的技巧(例如 setInterval
等待)以使其按预期工作。
要使测试文件按顺序运行,请使用 -i
或 --runInBand
标志
jest --runInBand
参考:jest docs
奇怪的是,在我的 M1 Mac 上按顺序运行测试完成得更快!为您的用例提供更好的测试
async
函数时,beforeEach
和afterEach
在各种情况下都没有用,因为如果 Jest 并行运行async
测试,则不再可能重置在每次测试后进行状态或清理,这会使测试很容易出现错误。beforeEach
和afterEach
用于在测试之间设置或清理,为了使这有意义,测试需要串行执行,而不是并行执行。 Jest(或任何运行程序)并行运行async
功能测试将是一个糟糕的 API 设计......setupFiles: ['<rootDir>/src/testing/integration/targetRandomDatabase.js'],
,在targetRandomDatabase.js
中,我们每次设置一个随机的新数据库 URL。设置文件为每个测试套件单独运行,因此可以防止干扰。我们使用mongodb-memory-server
为每次运行 jest 运行一个新的 mongodb,因此数据库会被自动丢弃。--runInBand
CLI 标志防止 jest 并行运行文件