不穩定的測試

「不穩定的」測試是指間歇性或偶發性失敗的測試,其行為看似非決定性的。有時它會通過,有時會失敗,而且原因不明。此頁面討論了 pytest 的功能,這些功能有助於識別、修復或減輕不穩定的測試。

為何不穩定的測試會造成問題

當使用持續整合 (CI) 伺服器時,不穩定的測試特別麻煩,因為在合併新的程式碼變更之前,所有測試都必須通過。如果測試結果不是可靠的訊號(測試失敗表示程式碼變更中斷了測試),開發人員可能會不信任測試結果,這可能會導致忽略真正的失敗。這也會浪費時間,因為開發人員必須重新執行測試套件並調查虛假的失敗。

潛在的根本原因

系統狀態

廣義來說,不穩定的測試表示測試依賴於未適當控制的某些系統狀態 - 測試環境未充分隔離。較高層級的測試較可能不穩定,因為它們依賴於更多狀態。

當測試套件並行執行時(例如使用 pytest-xdist),有時會出現不穩定的測試。這表示測試依賴於測試順序。

  • 也許不同的測試未清理自身,並遺留導致不穩定測試失敗的資料。

  • 不穩定的測試依賴於先前測試的資料,而先前測試未清理自身,且在並行執行時,先前測試並非總是存在

  • 通常無法並行執行修改全域狀態的測試。

過於嚴格的斷言

過於嚴格的斷言可能會導致浮點數比較問題以及時間問題。在此情況下,pytest.approx() 會很有用。

Pytest 功能

Xfail 嚴格

pytest.mark.xfail 搭配 strict=False 可用於標記測試,以使其失敗不會導致整個建置中斷。這可以視為手動隔離,且永久使用相當危險。

PYTEST_CURRENT_TEST

PYTEST_CURRENT_TEST 可能有助於找出「哪個測試卡住了」。有關更多詳細資訊,請參閱 PYTEST_CURRENT_TEST 環境變數

外掛程式

重新執行任何失敗的測試,可以透過給予它們更多通過的機會,來減輕不穩定的測試的負面影響,讓整體建置不會失敗。多個 pytest 外掛程式支援這個功能

故意將測試隨機化的外掛程式,有助於揭露有狀態問題的測試

其他一般策略

分割測試套件

將單一測試套件分割成兩個,例如單元測試和整合測試,並只使用單元測試套件作為 CI 閘道,是很常見的作法。這也有助於保持建置時間在可控範圍內,因為高階測試往往較慢。不過,這表示有可能會合併中斷建置的程式碼,因此需要特別注意監控整合測試結果。

失敗時錄製影片/截取螢幕畫面

對於 UI 測試,這些對於了解測試失敗時 UI 的狀態非常重要。pytest-splinter 可以搭配 pytest-bdd 等外掛程式使用,並且可以 在測試失敗時儲存螢幕畫面,這有助於找出原因。

刪除或重寫測試

如果其他測試涵蓋了該功能,也許可以移除該測試。如果不是,也許可以重新撰寫在較低層級,這將移除不穩定性或讓其來源更明顯。

隔離

Mark Lapierre 在 2018 年的一篇文章中討論了 隔離測試的優缺點

失敗時會重新執行的 CI 工具

Azure Pipelines(Azure 雲端 CI/CD 工具,以前稱為 Visual Studio Team Services 或 VSTS)有一個功能,可以 識別不穩定測試並重新執行失敗的測試。

研究

這是一個有限的清單,請提交問題或拉取請求以擴充它!

  • Gao, Zebao, Yalan Liang, Myra B. Cohen, Atif M. Memon, and Zhen Wang. “Making system user interactive tests repeatable: When and what should we control?.” In Software Engineering (ICSE), 2015 IEEE/ACM 37th IEEE International Conference on, vol. 1, pp. 55-65. IEEE, 2015. PDF

  • Palomba, Fabio, and Andy Zaidman. “Does refactoring of test smells induce fixing flaky tests?.” In Software Maintenance and Evolution (ICSME), 2017 IEEE International Conference on, pp. 1-12. IEEE, 2017. Google Drive 中的 PDF

  • Bell, Jonathan, Owolabi Legunsen, Michael Hilton, Lamyaa Eloussi, Tifany Yung, and Darko Marinov. “DeFlaker: Automatically detecting flaky tests.” In Proceedings of the 2018 International Conference on Software Engineering. 2018. PDF

  • Dutta, Saikat and Shi, August and Choudhary, Rutvik and Zhang, Zhekun and Jain, Aryaman and Misailovic, Sasa. “Detecting flaky tests in probabilistic and machine learning applications.” In Proceedings of the 29th ACM SIGSOFT International Symposium on Software Testing and Analysis (ISSTA), pp. 211-224. ACM, 2020. PDF

資源