自動化測試分層

2012年5月1日,Martin Fowler在他的博客(https://martinfowler.com/bliki/TestPyramid.html)上發表了著名的自動化測試金字塔。

Martin認爲,基於用戶接口(如UI)的自動化測試運行慢、效率低、維護開銷大。因此自動化測試應該投入更多的精力在單元(Unit)和接口(Service)層,這樣不僅自動化測試效率更高,還可以更早發現質量問題,提升系統質量。這個自動化測試金字塔後來被國內技術人員廣泛引用,成了實際意義上的標準。

但是這個自動化測試金字塔模型也一直飽受爭議,其中爭議最多的點在於UT(Unit Test ,單元測試)。Martin提出測試金字塔模型的時間是2012年,那時敏捷已經非常流行。敏捷以快速響應變化著稱,代碼自然也會頻繁變化。傳統意義下的UT,需要開發者針對代碼函數進行各種覆蓋測試,投入非常大,且UT一般和代碼強關聯,一旦代碼發生了變化,UT大概率也就失敗了。所以幾乎沒有開發者喜歡做UT,即便有很多公司會強制要求UT覆蓋率,但是執行效果也不盡人意。所以真實情況是,很多團隊UT都做得很弱。很多團隊真實的自動化測試分層,更像一顆釘子。

國內外測試行業有很多對自動化測試分層模型的探討,很多模型都非常有趣,例如Kent提出的獎盃模型,還有蜂巢模型等。

2021年6月2日,Martin在他的博客上深入討論了各種形式的自動化測試分層,以及他對單元測試、集成測試的理解(https://martinfowler.com/articles/2021-test-shapes.html),其中幾個觀點很值得我們討論回味。

觀點1 自動化測試分層,代表的是我們在各種測試類型上花費的精力,代表我們應該如何去平衡單元測試和其他測試的投入。金字塔模型認爲,需要將大部分測試精力放在單元測試中,而獎盃或者蜂巢模型代表我們應該把大部分測試精力放在集成測試(關注接口)。

觀點2 單元測試和集成測試的定義一直都相當模糊,很多開發者和測試者都並不真正清楚這兩者之間的區別是什麼。Martin是這樣闡述的:以大型瀑布式軟件開發爲例,開發者會獨立研究編寫大量代碼,無論這部分代碼有多大,只要開發者可以相對獨立地編寫、調試而不受到其他開發者的影響,就可以將其看成一個單元,對應的測試就是單元測試。測試完成後,開發者提交代碼,將自己的代碼和其他開發者的代碼進行集成,然後自己測試集成後的代碼的功能是否正確,這就是集成測試。Martin認爲單元測試和集成測試的關鍵區別在於,單元測試是獨立測試我們的代碼,而集成測試是測試我們寫的代碼如何和別人的代碼一起正常工作(The key distinction is that the unit tests test my/our code in isolation while integration tests how our code works with code developed separately)。

集成測試是更偏向於Sociable Tests的測試,而單元測試更傾向於Solitary Tests,這兩者之間並沒有那麼明顯的界限。

Martin的觀點給了我們一些如何在實際項目中解決“UT難”問題的啓發。

我們可以把單元測試理解爲,由開發者進行的,驗證自己寫的代碼的功能是否正確的測試。換句話說,單元測試不一定非是一個函數一個函數地進行測試,也可以是針對功能的測試,重點在於這個測試是由開發者站在代碼實現的角度,驗證自身代碼實現正確性的測試。與之類似,集成測試也是由開發者進行的,只不過其是站在代碼實現的角度,驗證自己寫的代碼和其他開發者寫的代碼是否可以正常工作。

無論是單元測試還是集成測試,都需要解決測試時模塊間的依賴問題(Test Double),開發者可以根據情況選擇合適的測試風格和方法,如Stub或者Mock。從這個角度來說,單元測試和集成測試並沒有本質的區別,都是開發者測試。

Test Double:爲保證測試代碼可以順利進行而編寫的各種依賴。

Stub:樁,在被測對象需要調用其他功能代碼時,提供所需功能存在的假象(被測對象:“我需要你。”Stub:“我在,我一直默默存在。”)來解除依賴,保證被測對象順利執行。

Mock:Mock會對預期進行編程,形成被調用後預期的規範。如果Mock收到一個不期望的調用,可以拋出異常(斷言)。

我們可以把自動化測試的底層作爲開發者測試層,在這個層次裏我們完全可以模糊單元測試和集成測試的邊界,只要開發者可以快速確認自己實現的正確性就行。

很多時候系統還會提供外部接口,如Restful、CLI(命令行)等。這些接口一般也會提供給最終用戶使用。建議測試者可以針對外部接口和UI界面接口進行自動化測試。這樣就可從開發者和測試者的角度,對自動化測試分層模型進行重新定義,


摘取自劉琛梅老師的《測試架構師修煉之道:從測試工程師到測試架構師 第2版》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章