《Unit Testing》1.1 -1.2 单元测试的目的
本系列是《Unit Testing》 一書的讀書筆記 + 精華提取。
書中的例子 C# 語言編寫,但概念是通用的,只要懂得面向?qū)ο缶幊叹涂梢浴?/span>
?
單元測試當前的狀態(tài)
目前,在(美國的)大部分公司里,單元測試都是強制性的。
生產(chǎn)代碼與測試代碼之間的比例大約在 1:1 到 1:3 之間。
有時候比例會更高,甚至達到 1:10
二十多年來,討論的話題已經(jīng)從“是否應該做單元測試”變成了“編寫出好的單元測試意味著什么?”
單元測試好與不好不僅僅是個人喜好品味的問題,更是與項目成功失敗密切相關(guān)
我們的目標不僅是掌握測試工具(很多資料都有這種教程),而是要:“不僅要寫單元測試,而且讓做單元測試的方式能夠為你提供最好的回報”
?
企業(yè)應用的特點是什么?
大量高復雜度的業(yè)務邏輯
項目的聲明周期很長
數(shù)據(jù)量不算特別大,也不小
對性能的要求不高或中等水平
?
單元測試的目的
單元測試的實踐通常會導致更好的設(shè)計,但這不是單元測試的主要目的,這僅僅是個副作用。
?
單元測試與代碼設(shè)計的關(guān)系
如果你的代碼很難進行單元測試,那這就是你代碼需要改進的強烈信號。
代碼質(zhì)量差的通常表現(xiàn)就是緊密的耦合,就是說不同的生產(chǎn)代碼段之間沒有足夠的解耦,所以很難對其進行單獨測試。
?
不幸的是:
代碼是否能進行單元測試這件事是一個負向指標(只能確定代碼質(zhì)量肯定不好);
如果你的代碼能夠容易的進行單元測試,并不意味著你的代碼質(zhì)量一定很高。
?
單元測試的目的就是讓軟件項目可持續(xù)的發(fā)展,“可持續(xù)”這個詞是關(guān)鍵。
下圖描述了項目有無單元測試與項目發(fā)展和消耗工時之間的關(guān)系:
這種迅速降低開發(fā)速度的現(xiàn)象就是軟件的熵。而熵就是體系混亂程度的度量。
在軟件中,熵以易于惡化的代碼形式表現(xiàn)出來。每次你改變代碼庫中的某個東西,其中的無序量,或者說熵,都會增加。
?
測試有助于扭轉(zhuǎn)這種趨勢。它們充當了一個安全網(wǎng)——一個為絕大多數(shù)回歸提供保險的工具。測試有助于確保現(xiàn)有功能正常工作,即使在引入新功能或重構(gòu)代碼以更好地適應新的需求之后。
?
回歸(regression),是指某個特性在某個事件(通常是代碼修改)之后停止按預期工作了。術(shù)語回歸和軟件 bug 是同義詞,可以互換使用。
?
可持續(xù)性和可擴展性是關(guān)鍵。從長遠來看,它們允許您保持開發(fā)速度。
?
什么是好和不好的單元測試?
此圖描述了較好、較差、沒有單元測試與項目發(fā)展和消耗工時的關(guān)系。
可以看出:不是所有的測試都是被平等創(chuàng)建的。
通過添加更多的測試并不會實現(xiàn)你單元測試的目標,你需要考慮測試的價值和維護成本。而成本取決于各項活動所花費的時間:
重構(gòu)底層代碼時重構(gòu)測試的時間
針對每次代碼修改,運行測試的時間
處理由測試引起的錯誤警報的時間
當您試圖理解底層代碼的行為時,閱讀測試所花的時間
?
由于維護成本高昂,很容易寫出凈價值接近于 0 甚至負價值的測試。
?
最后強調(diào)一點:代碼是一種負債,而不是資產(chǎn)。而測試也是代碼。
總結(jié)
以上是生活随笔為你收集整理的《Unit Testing》1.1 -1.2 单元测试的目的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core HttpClient
- 下一篇: 《Unit Testing》1.3 使用