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