运行 随机顺序的单元测试有什么意义?
What's the point of running unit tests in random order?
我注意到 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到底怎么会测试失败?!刚刚通过!”
随机化顺序对此有所帮助。每个测试 应该 完全隔离,它们 运行 的顺序无关紧要。将它们随机化可能有助于发现这种缺陷。
那么,鉴于顺序 不应该 重要,那么为什么 不 随机化顺序?
我注意到 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到底怎么会测试失败?!刚刚通过!”
随机化顺序对此有所帮助。每个测试 应该 完全隔离,它们 运行 的顺序无关紧要。将它们随机化可能有助于发现这种缺陷。
那么,鉴于顺序 不应该 重要,那么为什么 不 随机化顺序?