我注意到Karma在我的Angular构建中的默认行为是以随机顺序运行Jasmine单元测试。与每次都以相同顺序运行测试相比,以随机顺序运行测试有什么好处?
Karma
Angular
Jasmine
mkshixfv1#
有时候,测试修改的状态不会在每次测试运行时重置。也许某个测试修改了所有测试共享的全局变量。也许某个测试向数据库写入了一些内容,但在测试完成时没有将其清除。这些事情 * 不应该 * 发生,但有时确实会发生。例如:
// 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到底怎么会失败呢?!它刚刚通过了!”随机化测试顺序对这一点有点帮助。每个测试 * 应该 * 完全独立,不应该关心它们以什么顺序运行。随机化它们可能有助于发现这个缺点。那么,既然顺序不应该是重要的,那么为什么不随机化顺序呢?
1条答案
按热度按时间mkshixfv1#
有时候,测试修改的状态不会在每次测试运行时重置。也许某个测试修改了所有测试共享的全局变量。也许某个测试向数据库写入了一些内容,但在测试完成时没有将其清除。这些事情 * 不应该 * 发生,但有时确实会发生。
例如:
如果你总是运行测试A,然后B,然后C,这可能会很好。但是如果你只运行测试C,奇怪的事情可能会发生。因为测试A和B做了修改,当你同时运行它们时,C通过了。但是当你单独运行测试C时,它失败了。
而现在你盯着你的终端输出目瞪口呆地咕哝着“测试C到底怎么会失败呢?!它刚刚通过了!”
随机化测试顺序对这一点有点帮助。每个测试 * 应该 * 完全独立,不应该关心它们以什么顺序运行。随机化它们可能有助于发现这个缺点。
那么,既然顺序不应该是重要的,那么为什么不随机化顺序呢?