以随机顺序运行单元测试有什么意义?



我注意到Karma对于我的Angular构建的默认行为是以随机顺序运行Jasmine单元测试。以随机顺序运行测试与每次以相同顺序运行测试相比有什么好处?

有时测试修改的状态不会在每次测试运行时重置。也许一个测试修改了一个由所有测试共享的全局变量。也许测试向数据库中写入了一些内容,但在测试完成后没有清理它。这些事情不应该发生,但有时它们确实发生了。

例如:

// Stupid contrived example. Don't ever do this.
let num = 0
it('A', () => {
expect(num + 1).toEqual(1)
})
it('B', () => {
num = 10
expect(num + 2).toEqual(12)
})
it('C', () => {
expect(num + 3).toEqual(13) // passes if B is run before C, otherwise fails
})
如果你总是运行测试A,然后B,然后C,这可能工作得很好,但是如果你只运行测试C,就会发生奇怪的事情。因为测试A和B所做的更改,当你同时运行它们时,C通过了。但是当你单独运行测试C时,它失败了。

现在你正盯着你的终端输出目瞪口呆地嘟囔着"C测试怎么会失败?"它刚刚通过了!">

随机排序有助于这一点。每个测试应该是完全隔离的,它们运行的顺序是什么都不重要。随机化它们可能有助于揭示这种害处。

那么,既然的顺序不应该影响,那么为什么随机化顺序呢?

最新更新