qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

           第一章 為什么使用單元測(cè)試

           第一章 為什么使用單元測(cè)試

            1.1 程序員的工作——修改軟件

            修改既有代碼是程序員謀生的手段。但是為什么我們需要去修改軟件呢?修改軟件有以下4個(gè)主要起因:

            ● 修正bug

            ● 添加新特性(feature)

            ● 改善設(shè)計(jì)

            ● 優(yōu)化資源使用

            這4項(xiàng)都與軟件的“行為”密切相關(guān),見(jiàn)下表。


          軟件的既有行為
          軟件的新行為
          修正bug
          改變軟件的既有行為
          增加新行為
          添加新特性
          保持軟件的既有行為,完全不修改既有代碼
          無(wú)
          改善設(shè)計(jì)
          保持軟件的既有行為,但軟件的可維護(hù)性得到提升
          無(wú)
          優(yōu)化資源使用
          保持軟件的既有行為,但軟件的性能得到提升
          無(wú)

            通過(guò)這張表格我們看出:只有在修正bug時(shí),我們才需要改變軟件的既有行為,而在其他情況下,我們都需要保持住軟件的既有行為。如果我們?cè)诟纳圃O(shè)計(jì),優(yōu)化,或添加新特性時(shí)改變了軟件的既有行為,那我們實(shí)際上是給軟件引入了bug。

            可是程序員的工作就是修改軟件,所以我們有很多的“機(jī)會(huì)”給軟件引入bug。有什么辦法能讓我們的生活輕松一點(diǎn),而不用因?yàn)樾薷拇a引入bug而擔(dān)驚受怕嗎?

            1.2 軟件夾鉗——測(cè)試

            我們已經(jīng)看到:在大多數(shù)情況下,我們希望對(duì)軟件所做的改動(dòng)不會(huì)改變系統(tǒng)的既有行為。即使是對(duì)于修正bug這種情況,我們也希望一旦bug被修正,那么修正后的正確行為能夠得到保持,而不會(huì)被再之后的代碼修改所改變。怎樣做到這一點(diǎn)呢?

             讓我們這樣想想:如果我們能在對(duì)代碼進(jìn)行改動(dòng)之前,用一種“軟件夾鉗”(software vise)來(lái)固定住軟件的既有行為,那么我們就可以放心大膽地去修改代碼了。那么,又是什么可以來(lái)充當(dāng)“軟件夾鉗”呢?答案是:測(cè)試。我們可以這樣想一 下:當(dāng)一段代碼被一組良好的測(cè)試所覆蓋時(shí),我們就可以放手去修改這段代碼,并在修改完成之后立即運(yùn)行這組測(cè)試,來(lái)驗(yàn)證我們的修改并沒(méi)有改變既有行為而引入 bug。如果確實(shí)改變了既有行為,那么測(cè)試就會(huì)明確無(wú)誤地發(fā)出警報(bào)。由此可見(jiàn),測(cè)試就是程序員所需要的“軟件夾鉗”。

            1.3 單元測(cè)試與集成測(cè)試之爭(zhēng)

            我們已經(jīng)知道了“測(cè)試”就是程序員所需要的“軟件夾鉗”。但是測(cè)試分為單元測(cè)試和集成測(cè)試,程序員需要哪種測(cè)試呢?讓我們來(lái)分析一下程序員需要什么樣的測(cè)試,這樣或許我們就能知道程序員應(yīng)該更偏向于哪種測(cè)試了。

            ● 程序員需要的測(cè)試應(yīng)該是能幫助程序員定位錯(cuò)誤的,這樣程序員才會(huì)真正地從測(cè)試中得到“實(shí)惠”。

            ● 程序員需要的測(cè)試應(yīng)該是很容易執(zhí)行的,最好是只需點(diǎn)擊一個(gè)按鈕或鍵入一條命令,這些測(cè)試就能運(yùn)行,而無(wú)需費(fèi)時(shí)費(fèi)力地去搭建測(cè)試環(huán)境及準(zhǔn)備測(cè)試數(shù)據(jù)或儀器。

            ● 程序員需要的測(cè)試應(yīng)該是運(yùn)行速度很快的,最好能在幾分鐘內(nèi)完成,這樣程序員才能快速地得到反饋,采取下一步動(dòng)作。

            ● 程序員需要的測(cè)試應(yīng)該是易于寫(xiě)就的,而不愿意對(duì)代碼基大動(dòng)干戈,這樣程序員才會(huì)愿意去寫(xiě)這些測(cè)試。

            ● 程序員需要的測(cè)試應(yīng)該是自動(dòng)化的,可重復(fù)的。這樣程序員才會(huì)愿意重復(fù)多次地去運(yùn)行這種測(cè)試。

            比對(duì)程序員的需求,我們可以發(fā)現(xiàn)集成測(cè)試往往不能滿(mǎn)足程序員的這些需求:

            ● 集成測(cè)試由于涉及多個(gè)模塊,因此往往不能提供準(zhǔn)確的錯(cuò)誤定位信息。

            ● 集成測(cè)試的執(zhí)行時(shí)間一般較長(zhǎng)(小時(shí)級(jí)),這不能給程序員帶來(lái)快速反饋。

            ● 集成測(cè)試可以自動(dòng)化執(zhí)行,但前提是把測(cè)試環(huán)境和測(cè)試數(shù)據(jù)等事先準(zhǔn)備好。

            ● 集成測(cè)試由于不太容易寫(xiě)就,通常不是由程序員寫(xiě)就,而由專(zhuān)門(mén)的測(cè)試人員寫(xiě)就。

            相反,單元測(cè)試,尤其是良好的單元測(cè)試,恰恰正是程序員所需要的那種測(cè)試:

            單元測(cè)試針對(duì)單個(gè)類(lèi)或單個(gè)方法,能很有成效地幫助程序員準(zhǔn)確定位問(wèn)題所在。

            單元測(cè)試應(yīng)該是執(zhí)行時(shí)間很短的,全部執(zhí)行也只需5到10分鐘,程序員正好可以去喝喝咖啡。

            單元測(cè)試是一種“虛擬”測(cè)試,重在測(cè)試代碼邏輯,因此一般不需要真實(shí)測(cè)試環(huán)境和測(cè)試數(shù)據(jù)的支持。

            單元測(cè)試是很容易寫(xiě)就的,尤其是有單元測(cè)試框架的幫助時(shí)。

            由此可見(jiàn),對(duì)于程序員而言,需要的是單元測(cè)試。程序員使用單元測(cè)試來(lái)充當(dāng)軟件夾鉗,并在修改代碼時(shí)獲得快速反饋,從而更有信心地投入到修改軟件的工作中。

            1.4 進(jìn)行單元測(cè)試的其他好處

            我們已經(jīng)知道了單元測(cè)試帶來(lái)的一個(gè)好處:它可以充當(dāng)程序員的“軟件夾鉗”,在程序員修改軟件的過(guò)程中給予程序員快速的反饋,幫助程序員定位問(wèn)題,避免引入bug。單元測(cè)試就只有這一個(gè)好處嗎?不是的。下面我們就來(lái)看看引入單元測(cè)試帶來(lái)的其他好處。

            1.4.1 單元測(cè)試是代碼的“活文檔”

            讓文檔及時(shí)反映軟件設(shè)計(jì)和代碼的最新情況,這是一個(gè)頗有挑戰(zhàn)性的問(wèn)題。一種較好的思路是:使用“內(nèi)部”文檔,即把文檔同代碼“拴”在一起。這樣當(dāng)代碼發(fā)生改變的時(shí)候,文檔也能相應(yīng)更新。注釋就是一種內(nèi)部文檔,良好的注釋?xiě)?yīng)該反映代碼的最新?tīng)顩r。

            類(lèi)比來(lái)看,單元測(cè)試同樣也是內(nèi)部文檔,因?yàn)閱卧獪y(cè)試本質(zhì)上也是描述了被測(cè)類(lèi)或被測(cè)方法的行為。對(duì)軟件行為不了解的程序員,可以通過(guò)閱讀單元測(cè)試 代碼來(lái)理解軟件的行為。同注釋相比,單元測(cè)試還具有一個(gè)更好的特性:它是一種“可執(zhí)行”文檔。如果單元測(cè)試在被執(zhí)行時(shí)無(wú)法通過(guò),那么說(shuō)明要么單元測(cè)試沒(méi)有 反映當(dāng)前代碼的真實(shí)狀況,要么說(shuō)明代碼中有bug。無(wú)論哪種情況,程序員都需要修改某一方,以保持兩者的一致。

            1.4.2 具有可測(cè)試性的軟件具有更高的質(zhì)量

            近年來(lái)流行的極限編程方法論推崇“測(cè)試驅(qū)動(dòng)開(kāi)發(fā)”。我們認(rèn)為,“測(cè)試驅(qū)動(dòng)開(kāi)發(fā)”并不一定要求必須先有測(cè)試后有代碼,而關(guān)鍵在于要求在設(shè)計(jì)軟件和 實(shí)現(xiàn)編碼時(shí),一定要預(yù)先把軟件的可測(cè)試性考慮周全。這種可測(cè)試性的重要體現(xiàn)就是能夠方便地將單個(gè)類(lèi)或方法納入單元測(cè)試之中。具有可測(cè)試性的軟件的質(zhì)量往往 高于不具有可測(cè)試性的軟件,為什么這樣說(shuō)呢?

            ● 一個(gè)類(lèi)能夠被方便地納入單元測(cè)試,往往說(shuō)明這個(gè)類(lèi)職責(zé)單一,也就是說(shuō)它滿(mǎn)足“單一職責(zé)原則”。

            ● 一個(gè)類(lèi)能夠被方便地納入單元測(cè)試,往往說(shuō)明它與其他類(lèi)之間的耦合程度較低,相互依賴(lài)性較小,而且很可能滿(mǎn)足“依賴(lài)抽象原則”和“開(kāi)放-封閉原則”。

            因此, 具有可測(cè)試性的軟件,也更有可能是滿(mǎn)足良好設(shè)計(jì)原則的軟件,所以往往質(zhì)量更高。

          posted on 2011-10-09 18:14 順其自然EVO 閱讀(218) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 測(cè)試學(xué)習(xí)專(zhuān)欄

          <2011年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 乐安县| 东明县| 呈贡县| 安国市| 湟中县| 镇巴县| 衡水市| 长岛县| 阿巴嘎旗| 阳山县| 花莲县| 灌云县| 高州市| 马边| 富阳市| 崇明县| 昆山市| 盐津县| 凤凰县| 武穴市| 济源市| 永丰县| 友谊县| 博乐市| 伊吾县| 乃东县| 长岭县| 崇礼县| 灵武市| 临江市| 泸定县| 法库县| 志丹县| 崇礼县| 乐昌市| 尉犁县| 松阳县| 滁州市| 九龙坡区| 三明市| 三门县|