Jest在文档中说: “Jest虚拟化JavaScript环境并在工作进程之间并行运行测试。”
但是一个文件中的多个测试怎么样,它们是并行运行还是这个语句只适用于测试文件?我可以假设一个文件中的测试按照外观和串行顺序运行吗?
答案 0 :(得分:19)
是的,您可以放心地假设单个文件中的测试将按照外观顺序运行。您可以通过在console.log
块中添加it
来证明这一点。
值得一提的是,依赖执行顺序/外部状态通常是不好的做法......你永远不会知道,Jest(或当前的底层测试运行者Jasmine)可能决定以随机顺序运行它们在较新的版本中。
答案 1 :(得分:12)
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()
语句也将并行执行,即使它们位于同一文件中。
答案 2 :(得分:1)
如果要在一个文件中并行运行test.concurrent('test run concurrently', () => { ... })
,则可以使用async
。这是个小虫子,而且没有很好的记录,但是至少有一种方法。
我注意到的一件事是它不会等待beforeAll()
中的setInterval
东西,因此您需要一些技巧(如const [blocks, setBlocks] = useState({
"time": null,
"blocks": [
{
"key": 1,
"data": "This is some data"
}
]
});
等)才能使其按预期工作
答案 3 :(得分:1)
请注意,如果其中一个在 5 seconds 之后超时,您可能会遇到并行运行的两个测试的副作用 - jest 停止等待超时测试,但它的代码继续执行,与以下测试并行开玩笑。
(在我意识到这是导致我来到这里的副作用的原因之前拔掉了相当多的头发)