在 Jest 中,一个文件 运行 中的测试是并行的吗?
Are tests inside one file run in parallel in Jest?
Jest 在文档中指出:
"Jest virtualizes JavaScript environments and runs tests in parallel across worker processes."
但是一个文件中的多个测试呢,它们是并行 运行 还是此语句仅适用于测试文件?我可以假设在一个文件 运行 中按出现顺序和顺序进行测试吗?
是的,您可以放心地假设单个文件中的测试将 运行 按出现顺序排列。您可以通过在每个 it
块中放置一个 console.log
来证明这一点。
可能值得一提的是,依赖执行顺序/外部状态通常是不好的做法......而且你永远不知道,Jest(或当前的底层测试 运行ner,Jasmine)可能会决定运行 在新版本中以随机顺序排列它们。
2020 年开玩笑
要对此添加更多信息,async
测试是 运行 in series inside describe()
语句。这对于 IO/Database 设置和清理功能很有用。看看下面的例子:
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()
语句将并行执行,即使它们在同一个文件中。
如果你想test.concurrent('test run concurrently', () => { ... })
你可以使用test.concurrent('test run concurrently', () => { ... })
运行它们在一个文件中并行处理太慢了。它有点问题,而且没有很好的记录,但至少有办法。
我注意到的一件事是它不会等待 beforeAll()
中的 async
东西,所以你需要一些你自己的技巧(比如 setInterval
等待)来让它工作不出所料。
请注意,如果其中一个测试在 5 seconds 之后超时,您可能会同时获得两个测试 运行 的副作用 - jest 停止等待超时测试,但它的代码继续执行,与以下测试同时开玩笑。
(在我意识到这是导致我来到这里的副作用的原因之前拔了很多头发)
要使测试文件 运行 顺序使用 -i
或 --runInBand
标志
jest --runInBand
参考:jest docs
奇怪的是,运行在我的 M1 Mac 上按顺序完成测试更快!,更好地测试您的用例
Jest 在文档中指出: "Jest virtualizes JavaScript environments and runs tests in parallel across worker processes."
但是一个文件中的多个测试呢,它们是并行 运行 还是此语句仅适用于测试文件?我可以假设在一个文件 运行 中按出现顺序和顺序进行测试吗?
是的,您可以放心地假设单个文件中的测试将 运行 按出现顺序排列。您可以通过在每个 it
块中放置一个 console.log
来证明这一点。
可能值得一提的是,依赖执行顺序/外部状态通常是不好的做法......而且你永远不知道,Jest(或当前的底层测试 运行ner,Jasmine)可能会决定运行 在新版本中以随机顺序排列它们。
2020 年开玩笑
要对此添加更多信息,async
测试是 运行 in series inside describe()
语句。这对于 IO/Database 设置和清理功能很有用。看看下面的例子:
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()
语句将并行执行,即使它们在同一个文件中。
如果你想test.concurrent('test run concurrently', () => { ... })
你可以使用test.concurrent('test run concurrently', () => { ... })
运行它们在一个文件中并行处理太慢了。它有点问题,而且没有很好的记录,但至少有办法。
我注意到的一件事是它不会等待 beforeAll()
中的 async
东西,所以你需要一些你自己的技巧(比如 setInterval
等待)来让它工作不出所料。
请注意,如果其中一个测试在 5 seconds 之后超时,您可能会同时获得两个测试 运行 的副作用 - jest 停止等待超时测试,但它的代码继续执行,与以下测试同时开玩笑。
(在我意识到这是导致我来到这里的副作用的原因之前拔了很多头发)
要使测试文件 运行 顺序使用 -i
或 --runInBand
标志
jest --runInBand
参考:jest docs
奇怪的是,运行在我的 M1 Mac 上按顺序完成测试更快!,更好地测试您的用例