網站搜尋

javascript - 隨機順序執行單元測試的意義何在?


我注意到 Karma 對我的 Angular 架構的預設行為是以隨機順序運行 Jasmine 單元測試。以隨機順序運行測試,相對於每次都以相同順序運行,有什麼好處?

答案#1

有時候測試會修改一些在每次測試運行時不會重置的狀態。也許某個測試修改了一個所有測試都共享的全局變數。也許某個測試向數據庫寫入了一些東西,但在測試完成後沒有清理。這些事情不應該發生,但有時它們確實會發生。

例如:

// 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 怎麼可能會失敗?!它明明剛通過了!」

隨機化順序在這方面有些幫助。每個測試應該是完全隔離的,執行順序不應該有任何影響。隨機化它們可能有助於揭露這種問題。

所以,既然順序 不應該 重要,那為什麼不隨機排列順序呢?