目錄:
- 安裝及入門
- 使用和調用方法
- 原有TestSuite使用方法
- 斷言的編寫和報告
- Pytest fixtures:清晰 模塊化 易擴展
- 使用Marks標記測試用例
- Monkeypatching/對模塊和環境進行Mock
- 使用tmp目錄和文件
- 捕獲stdout及stderr輸出
- 捕獲警告信息
- 模塊及測試文件中集成doctest測試
- skip及xfail: 處理不能成功的測試用例
- Fixture方法及測試用例的參數化
- 緩存: 使用跨執行狀態
- unittest.TestCase支持
- 運行Nose用例
- 經典xUnit風格的setup/teardown
- 安裝和使用插件
- 插件編寫
- 編寫鉤子(hook)方法
- 運行日志
- API參考
- 優質集成實踐
- 片狀測試
- Pytest導入機制及sys.path/PYTHONPATH
- 配置選項
- 示例及自定義技巧
- Bash自動補全設置
片狀”測試是表現出間歇性或偶發性失敗的測試,似乎具有非確定性行為。有時它會通過,有時會失敗,而且不清楚為什么。本頁討論了可以提供幫助的pytest功能以及識別,修復或減輕它們的其他一般策略。
為什么片狀測試是個問題
當使用連續集成(CI)服務器時,片狀測試尤其麻煩,因此在合并新代碼更改之前必須通過所有測試。如果測試結果不是一個可靠的信號 - 測試失敗意味著代碼更改破壞了測試 - 開發人員可能會對測試結果產生不信任,這可能導致忽略真正的失敗。它也是浪費時間的一個來源,因為開發人員必須重新運行測試套件并調查虛假故障。
潛在的根本原因
系統狀態
從廣義上講,一個片狀測試表明測試依賴于一些未被適當控制的系統狀態 - 測試環境沒有充分隔離。更高級別的測試更有可能是因為他們依賴更多的狀態。
當測試套件并行運行時(例如使用pytest-xdist),有時會出現片狀測試。這可以表明測試依賴于測試排序。
- 也許不同的測試是在自身之后無法清理并留下導致片狀測試失敗的數據。
- 片狀測試依賴于先前測試的數據,該測試不會自行清理,并且并行運行以前的測試并不總是存在
- 修改全局狀態的測試通常不能并行運行。
過于嚴格的斷言
過于嚴格的斷言可能會導致浮點比較以及時序問題。pytest.approx在這里很有用。
Pytest功能
Xfail嚴格
pytest.mark.xfail withstrict=False
可用于標記測試,以便其失敗不會導致整個構建中斷。這可以被視為手動隔離,永久使用是相當危險的。
PYTEST_CURRENT_TEST
PYTEST_CURRENT_TEST環境變量可用于確定“哪個測試卡住了”。
插件
重新運行任何失敗的測試可以通過給予他們額外的機會來減輕片狀測試的負面影響,這樣整體構建就不會失敗。幾個pytest插件支持這個:
- 片狀
- pytest-flakefinder - 博客文章
- pytest-rerunfailures
- pytest-replay:這個插件有助于重現CI運行期間觀察到的局部崩潰或片狀測試。
故意隨機化測試的插件可以幫助公開測試狀態問題:
其他一般策略
拆分測試套件
將單個測試套件拆分為兩個是常見的,例如單元與集成,并且僅將單元測試套件用作CI門。這也有助于保持構建時間的可管理性,因為高級別測試往往更慢。但是,這意味著打破構建的代碼可能會合并,因此需要額外的警惕來監視集成測試結果。
失敗的視頻/截圖
對于UI測試,這些對于了解測試失敗時UI的狀態非常重要。pytest-splinter可以與pytest-bdd這樣的插件一起使用,并且可以在測試失敗時保存屏幕截圖,這有助于隔離原因。
刪除或重寫測試
如果其他測試涵蓋了該功能,則可能會刪除該測試。如果沒有,也許它可以在較低的水平重寫,這將消除片狀或使其來源更明顯。
隔離
Mark Lapierre 在2018年的一篇文章中討論了隔離測試的優缺點。
在失敗時重新運行的CI工具
Azure管道(Azure云CI / CD工具,以前稱為Visual Studio Team Services或VSTS)具有識別片狀測試和重新運行失敗測試的功能。
研究
這是一個有限的列表,請提交問題或拉取請求以擴展它!
- Gao,Zebao,Yalan Liang,Myra B. Cohen,Atif M. Memon和Zhen Wang。“使系統用戶交互式測試可重復:何時以及我們應該控制什么?”在軟件工程(ICSE),2015 IEEE / ACM第37屆IEEE國際會議上,第一卷。1,pp.55-65。IEEE,2015年 PDF
- Palomba,Fabio和Andy Zaidman。“測試氣味的重構是否會導致固定片狀測試?”在軟件維護和演進(ICSME),2017 IEEE國際會議上,第1-12頁。IEEE,2017.Google Drive中的PDF
- Bell,Jonathan,Owolabi Legunsen,Michael Hilton,Lamyaa Eloussi,Tifany Yung和Darko Marinov。“DeFlaker:自動檢測片狀測試。”在2018年國際軟件工程會議論文集中。2018. PDF
資源
- 在馬丁福勒,2011年消除測試中的非決定論
- 2012年,Pavan Sudarshan 對Go團隊的測試沒有更多
- 破碎的建筑:在持續集成測試中建立信任測試由Angie Jones在2017年奧斯汀SeleniumConf上講話(視頻)
- 測試和代碼播客:片狀測試以及如何處理它們由Brian Okken和Anthony Shaw,2018年
- 微軟:
- 我們如何通過測試VSTS來實現 2017年Brian Harry MS的持續交付
- 2017年,Munil Shah 消除了Flaky Tests的博客和談話(視頻)
- 谷歌:
- 谷歌的片狀測試和我們如何減輕他們的影響,約翰米科,2016年
- 谷歌的片狀測試來自哪里? 作者:Jeff Listfield,2017