如何做好單元測(cè)試
單元測(cè)試是對(duì)軟件基本組成單元進(jìn)行的測(cè)試,是屬于白盒測(cè)試的范疇,它主要通過(guò)對(duì)代碼的邏輯結(jié)構(gòu)進(jìn)行分析來(lái)設(shè)計(jì)測(cè)試用例。在動(dòng)態(tài)測(cè)試手段中,單元測(cè)試是一種非常高效的測(cè)試方法,并且是軟件測(cè)試周期中第一個(gè)進(jìn)行的測(cè)試。從成本角度考慮,缺陷發(fā)現(xiàn)越早越好,加強(qiáng)單元測(cè)試力度有利于降低缺陷定位和修復(fù)難度,從而降低缺陷解決成本,同時(shí)加強(qiáng)單元測(cè)試也減輕了后續(xù)集成測(cè)試和系統(tǒng)測(cè)試的負(fù)擔(dān)。根據(jù)業(yè)界的統(tǒng)計(jì),一個(gè) BUG 在單元測(cè)試階段發(fā)現(xiàn)花費(fèi)是 1 的話,到集成測(cè)試就變?yōu)?10 ,到系統(tǒng)測(cè)試就高達(dá) 100 ,到實(shí)際推向市場(chǎng)量產(chǎn)后就高達(dá) 1000 。但單元測(cè)試在目前國(guó)內(nèi)軟件企業(yè)中開展得并不好,一方面是由于對(duì)單元測(cè)試重視程度不夠,測(cè)試投入不足,另一方面是由于在單元測(cè)試實(shí)踐方面積累得也不夠,單元測(cè)試處于一種摸索狀態(tài)。
軟件的質(zhì)量由組織、流程和技術(shù)三個(gè)維度來(lái)決定,任何一個(gè)維度都不能單獨(dú)決定軟件的質(zhì)量。好的組織結(jié)構(gòu)可以保證流程的順利實(shí)施,好的流程能提高軟件開發(fā)的規(guī)范性和可控性,從而提高軟件開發(fā)的效率和質(zhì)量,而采用了好的技術(shù)和有好的技術(shù)的載體 —— 人,則從根本上保證了軟件的質(zhì)量。
總而言之,組織、流程和技術(shù)是軟件質(zhì)量三角,本文將從這三個(gè)方面對(duì)如何做好單元測(cè)試進(jìn)行論述。
組織結(jié)構(gòu)應(yīng)該保證測(cè)試組參與單元測(cè)試
目前無(wú)論是工業(yè)界還是學(xué)術(shù)界都認(rèn)為單元測(cè)試應(yīng)該由開發(fā)人員開展,這是因?yàn)閺膯卧獪y(cè)試的過(guò)程看,單元測(cè)試普遍采用白盒測(cè)試的方法,離不開深入被測(cè)對(duì)象的代碼,同時(shí)還需要構(gòu)造驅(qū)動(dòng)模塊、樁函數(shù),因此開展單元測(cè)試需要較好的開發(fā)知識(shí)。從人員的知識(shí)結(jié)構(gòu)、對(duì)代碼的熟悉程度考慮,開發(fā)人員具有一定的優(yōu)勢(shì)。
單元測(cè)試由開發(fā)人員進(jìn)行能帶來(lái)一些特別的收益。我們知道,在實(shí)踐中開發(fā)人員進(jìn)行單元測(cè)試一般推薦采用交叉測(cè)試的方法,例如由被測(cè)單元的調(diào)用方進(jìn)行該單元的測(cè)試,即盡量避免對(duì)自己的代碼進(jìn)行單元測(cè)試。這種交叉的測(cè)試安排可以避免測(cè)試受開發(fā)思路影響太大,局限于原來(lái)的思路不容易發(fā)現(xiàn)開發(fā)過(guò)程中制造的問題;二來(lái)也達(dá)到一個(gè)技術(shù)備份或充分交流的目的,這對(duì)組織非常有利。即使不采用交叉測(cè)試的方法,而安排單元的生產(chǎn)者自行開展單元測(cè)試,也是有很大的優(yōu)越性的,其最大的優(yōu)點(diǎn)是快速,且能更好的實(shí)現(xiàn) “ 預(yù)防錯(cuò)誤 ” 。在人員緊張的情況下這種自行測(cè)試的安排也是不錯(cuò)的選擇。
從經(jīng)驗(yàn)值來(lái)看,單元測(cè)試投入和編碼投入相比基本上是一比一,如果由專職測(cè)試隊(duì)伍來(lái)進(jìn)行單元測(cè)試,維持這樣龐大的單一任務(wù)隊(duì)伍顯然是不合適的。
以上談的是由開發(fā)人員進(jìn)行單元測(cè)試的優(yōu)點(diǎn),其中主要是從單元測(cè)試的效率角度來(lái)考慮。但是從單元測(cè)試效果的角度考慮,必須從組織結(jié)構(gòu)上保證測(cè)試組參與單元測(cè)試,這是因?yàn)椋?/p>
首先,從目前國(guó)內(nèi)企業(yè)普遍現(xiàn)狀來(lái)看,測(cè)試人員質(zhì)量意識(shí)要高于開發(fā)人員,測(cè)試人員參與單元測(cè)試能夠提高測(cè)試質(zhì)量。
其次,對(duì)被測(cè)系統(tǒng)越了解,測(cè)試才有可能越深入,測(cè)試人員參與單元測(cè)試,將使得測(cè)試人員能夠從代碼級(jí)熟悉被測(cè)系統(tǒng),這對(duì)測(cè)試組后期集成測(cè)試和系統(tǒng)測(cè)試活動(dòng)非常有幫助,會(huì)很大的提升集成測(cè)試和系統(tǒng)測(cè)試質(zhì)量。
測(cè)試組以何種方式參與單元測(cè)試,應(yīng)該結(jié)合軟件組織的實(shí)際情況來(lái)定。如果軟件組織測(cè)試資源充分,測(cè)試人員對(duì)開發(fā)人員的比例較高,那么可以由測(cè)試人員獨(dú)立承擔(dān)部分重要模塊的單元測(cè)試工作;如果測(cè)試資源不足,測(cè)試人員對(duì)開發(fā)人員的比例較低,那么可以采取由測(cè)試人員進(jìn)行單元測(cè)試計(jì)劃、單元測(cè)試設(shè)計(jì)的工作,而單元測(cè)試的實(shí)現(xiàn)和執(zhí)行由開發(fā)人員來(lái)完成;而如果測(cè)試資源非常缺乏,連單元測(cè)試計(jì)劃、單元測(cè)試設(shè)計(jì)都無(wú)法承擔(dān),那么測(cè)試組至少應(yīng)該參與開發(fā)組的各相關(guān)單元測(cè)試文檔、單元測(cè)試報(bào)告的評(píng)審,保證單元測(cè)試的質(zhì)量。
加強(qiáng)單元測(cè)試流程規(guī)范性
● 制訂單元測(cè)試的過(guò)程定義
軟件質(zhì)量的提高需要規(guī)范的流程,對(duì)軟件開發(fā)過(guò)程進(jìn)行管理也需要依據(jù)規(guī)范的過(guò)程定義。過(guò)程定義包含階段的劃分、階段的入口 / 出口準(zhǔn)則、階段的輸入 / 輸出、角色和職責(zé)、模板和查檢表等等。將單元測(cè)試劃分為幾個(gè)階段便于對(duì)單元測(cè)試過(guò)程進(jìn)行控制,體現(xiàn)軟件測(cè)試可控性。要提高單元測(cè)試的質(zhì)量,首先要制定規(guī)范的單元測(cè)試過(guò)程,開發(fā)組、測(cè)試組、 SCM 組、 SQA 組等可以依據(jù)單元測(cè)試過(guò)程定義開展各自的工作,共同保證單元測(cè)試的質(zhì)量。
單元測(cè)試過(guò)程的定義需要參照企業(yè)的實(shí)際情況,例如階段劃分可以分為四個(gè)階段:計(jì)劃、設(shè)計(jì)、實(shí)現(xiàn)、執(zhí)行。其中計(jì)劃階段應(yīng)當(dāng)考慮整個(gè)單元測(cè)試過(guò)程的時(shí)間表,工作量,任務(wù)的劃分情況,人員和資源的安排情況,需要的測(cè)試工具和測(cè)試方法,單元測(cè)試結(jié)束的標(biāo)準(zhǔn)及驗(yàn)收的標(biāo)準(zhǔn)等,同時(shí)還應(yīng)當(dāng)考慮可能存在的風(fēng)險(xiǎn),以及針對(duì)這些風(fēng)險(xiǎn)的具體處理辦法,并輸出《單元測(cè)試計(jì)劃》文檔,作為整個(gè)單元測(cè)試過(guò)程的指導(dǎo)。設(shè)計(jì)階段需要具體考慮對(duì)哪些單元進(jìn)行測(cè)試,被測(cè)單元之間的關(guān)系以及同其他模塊之間單元的關(guān)系,具體測(cè)試的策略采用哪一種、如何進(jìn)行單元測(cè)試用例的設(shè)計(jì)、如何進(jìn)行單元測(cè)試代碼設(shè)計(jì)、采用何種工具等,并輸出《單元測(cè)試方案》文檔,用來(lái)指導(dǎo)具體的單元測(cè)試操作。實(shí)現(xiàn)階段需要完成單元測(cè)試用例設(shè)計(jì)、腳本的編寫,測(cè)試驅(qū)動(dòng)模塊的編寫,測(cè)試樁模塊的編寫工作,輸出《單元測(cè)試用例》文檔、相關(guān)測(cè)試代碼。執(zhí)行階段的主要工作是搭建單元測(cè)試環(huán)境,執(zhí)行測(cè)試腳本,記錄測(cè)試結(jié)果,如果發(fā)現(xiàn)錯(cuò)誤,開發(fā)人員需要負(fù)責(zé)錯(cuò)誤的修改,同時(shí)進(jìn)行回歸測(cè)試,該階段結(jié)束需要提交《單元測(cè)試報(bào)告》。
具體進(jìn)行單元測(cè)試過(guò)程定義的時(shí)候,可以進(jìn)行一定的裁減,例如可以裁減為設(shè)計(jì)和執(zhí)行兩個(gè)階段,將《單元測(cè)試方案》和《單元測(cè)試用例》合二為一。
● 單元測(cè)試工作產(chǎn)品必須納入配置管理
單元測(cè)試工作產(chǎn)品指單元測(cè)試完成后應(yīng)交付的測(cè)試文檔、測(cè)試代碼及測(cè)試工具等,一般包括但不限于如下工作產(chǎn)品,可以根據(jù)實(shí)際情況進(jìn)行適當(dāng)裁剪:
● 單元測(cè)試計(jì)劃
● 單元測(cè)試方案
● 單元測(cè)試用例
● 單元測(cè)試規(guī)程
● 單元測(cè)試日?qǐng)?bào)
● 單元測(cè)試問題單
● 單元測(cè)試報(bào)告
● 單元測(cè)試輸入及輸出數(shù)據(jù)
● 單元測(cè)試工具
● 單元測(cè)試代碼及設(shè)計(jì)文檔
為了保證單元測(cè)試工作產(chǎn)品的準(zhǔn)確性,需要對(duì)測(cè)試代碼和腳本進(jìn)行走讀或檢視,對(duì)測(cè)試文檔進(jìn)行評(píng)審。這些工作產(chǎn)品應(yīng)該納入到配置管理,對(duì)于其修改要走配置變更流程,并及時(shí)發(fā)布其配置狀態(tài),這樣可以保持單元測(cè)試工作產(chǎn)品的一致性和可回溯性。
● 必須制訂覆蓋率指標(biāo)和質(zhì)量目標(biāo)來(lái)指導(dǎo)和驗(yàn)收單元測(cè)試
單元測(cè)試必須制訂一定的覆蓋率指標(biāo)和質(zhì)量目標(biāo),來(lái)指導(dǎo)單元測(cè)試設(shè)計(jì)和執(zhí)行,同時(shí)作為單元測(cè)試驗(yàn)收的標(biāo)準(zhǔn)。設(shè)計(jì)用例時(shí),可針對(duì)要達(dá)到的覆蓋率指標(biāo)來(lái)設(shè)計(jì)用例,而在測(cè)試執(zhí)行時(shí),可以依據(jù)覆蓋率分析工具分析測(cè)試是否達(dá)到了覆蓋率指標(biāo),如果沒達(dá)到,需要分析哪些部分沒有覆蓋到,從而補(bǔ)充用例來(lái)達(dá)到覆蓋率指標(biāo)。而單元測(cè)試質(zhì)量目標(biāo)的制訂,需要符合軟件企業(yè)的實(shí)際過(guò)程能力,這依賴于軟件企業(yè)以前單元測(cè)試過(guò)程度量數(shù)據(jù)的積累,不能憑空制造出來(lái)。有了以前度量數(shù)據(jù)的積累,完全可以了解當(dāng)前組織的單元測(cè)試能力,例如單元測(cè)試每千行代碼發(fā)現(xiàn)的缺陷數(shù)是多少。如果單元測(cè)試統(tǒng)計(jì)結(jié)果沒有落到這個(gè)質(zhì)量目標(biāo)范圍內(nèi),說(shuō)明單元測(cè)試過(guò)程中某些方面存在一些問題,需要對(duì)過(guò)程進(jìn)行審計(jì)后找出問題原因進(jìn)行改進(jìn)。
這些指標(biāo)確定下來(lái)后,一定要嚴(yán)格推行。會(huì)有一些測(cè)試人員找出各種理由證明覆蓋率指標(biāo)達(dá)不到等等,這需要 QA 根據(jù)實(shí)際情況分析指標(biāo)是否合理。實(shí)際證明有一個(gè)相對(duì)簡(jiǎn)單的標(biāo)準(zhǔn)也比沒有標(biāo)準(zhǔn)要好得多,我們的實(shí)踐發(fā)現(xiàn),通過(guò)推行硬性指標(biāo),單元測(cè)試發(fā)現(xiàn)的問題數(shù)目比沒有標(biāo)準(zhǔn)前至少增加了 2 倍。
● 加強(qiáng)詳細(xì)設(shè)計(jì)文檔評(píng)審
詳細(xì)設(shè)計(jì)是單元測(cè)試的主要輸入,詳細(xì)設(shè)計(jì)文檔的質(zhì)量將直接影響到單元測(cè)試的質(zhì)量,所以一定要加強(qiáng)詳細(xì)設(shè)計(jì)文檔的評(píng)審,特別是要寫相關(guān)測(cè)試方案和進(jìn)行測(cè)試用例設(shè)計(jì)的人員,一定要從寫測(cè)試用例的角度看這個(gè)詳設(shè)是否符合要求,否則后期進(jìn)行單元測(cè)試設(shè)計(jì)時(shí)會(huì)發(fā)現(xiàn)無(wú)法依據(jù)詳細(xì)設(shè)計(jì)進(jìn)行單元測(cè)試設(shè)計(jì)。軟件組織可以將詳細(xì)設(shè)計(jì)評(píng)審的要點(diǎn)以查檢表的形式固化下來(lái),這樣在詳細(xì)設(shè)計(jì)評(píng)審的時(shí)候依據(jù)查檢表一項(xiàng)項(xiàng)檢查,既提高了評(píng)審效率,也能保證評(píng)審效果。評(píng)審流程需要確定如果不滿足查檢表 n% 以上的條件,被評(píng)審詳細(xì)設(shè)計(jì)文檔就不能通過(guò),需要重新設(shè)計(jì)。
通常詳細(xì)設(shè)計(jì)文檔有兩種形式,一種是流程圖的形式,另一種是偽碼的形式。用流程圖表達(dá)的優(yōu)點(diǎn)是直觀,利于單元測(cè)試用例設(shè)計(jì),缺點(diǎn)是描述性比較差,文檔寫作麻煩,不利于文檔的變更和修改;偽碼的方式可能正好相反,文檔變更修改簡(jiǎn)單,可以方便地在任何地方增加文字說(shuō)明,而且翻譯成代碼更加便捷,但不直觀,不利于進(jìn)行單元測(cè)試用例設(shè)計(jì)。
詳細(xì)設(shè)計(jì)和單元測(cè)試設(shè)計(jì)一定要分離。如果單元測(cè)試由測(cè)試人員承擔(dān),這一點(diǎn)不會(huì)有什么問題;如果單元測(cè)試由開發(fā)人員承擔(dān),那么實(shí)際操作時(shí)可以讓項(xiàng)目組內(nèi)做相同或者相近任務(wù)的成員相互交換,根據(jù)對(duì)方的詳設(shè)設(shè)計(jì)對(duì)方的單元測(cè)試。這樣在單元測(cè)試開始之前的詳細(xì)設(shè)計(jì)評(píng)審階段就要考慮到后面的分工,安排相關(guān)的單元測(cè)試設(shè)計(jì)人員參與相關(guān)詳細(xì)設(shè)計(jì)的評(píng)審。
如果代碼沒有對(duì)應(yīng)的經(jīng)過(guò)評(píng)審后的詳細(xì)設(shè)計(jì)文檔,建議不進(jìn)行單元測(cè)試,而是用代碼審查替代單元測(cè)試。
開發(fā)人員在編碼的過(guò)程中,可能會(huì)發(fā)現(xiàn)詳設(shè)中的問題,并對(duì)代碼進(jìn)行修改,這種修改應(yīng)該回溯到詳設(shè),并對(duì)詳設(shè)進(jìn)行相應(yīng)的修改,否則到單元測(cè)試執(zhí)行的時(shí)候,會(huì)發(fā)現(xiàn)代碼和詳設(shè)根本對(duì)不上,無(wú)法執(zhí)行下去。詳設(shè)的修改要受控制,要走變更控制流程,它的變更也要經(jīng)過(guò)評(píng)審。因?yàn)閱卧獪y(cè)試是詳細(xì)設(shè)計(jì)的下游活動(dòng),如果詳細(xì)設(shè)計(jì)隨意更改,單元測(cè)試文檔很難和其保持一致,這樣單元測(cè)試也就失去了依據(jù)和意義。只有詳設(shè)也納入配置管理,才能保證單元測(cè)試和詳設(shè)的一致性。
單元測(cè)試者技能的提高
1 .加強(qiáng)對(duì)單元測(cè)試人員的技能培訓(xùn)
單元測(cè)試的質(zhì)量很大程度上決定于進(jìn)行單元測(cè)試的人的技術(shù)水平。如果測(cè)試者不具備單元測(cè)試的知識(shí),那么應(yīng)該對(duì)測(cè)試者進(jìn)行相關(guān)的培訓(xùn)。一個(gè)沒有做過(guò)單元測(cè)試人,不經(jīng)過(guò)培訓(xùn)初次是很難做好單元測(cè)試的。單元測(cè)試在詳設(shè)階段結(jié)束時(shí)開始,但是單元測(cè)試相關(guān)培訓(xùn)應(yīng)該盡早準(zhǔn)備和計(jì)劃,培訓(xùn)可以分兩個(gè)階段,每個(gè)階段的內(nèi)容類似。第一階段是寫單元測(cè)試方案前,培訓(xùn)對(duì)象為測(cè)試方案的寫作者和詳設(shè)的寫作者,這樣可以在設(shè)計(jì)時(shí)多考慮可測(cè)試性,培訓(xùn)的內(nèi)容為單元測(cè)試基本概念、單元測(cè)試分析方法、單元測(cè)試用例的寫作、單元測(cè)試標(biāo)準(zhǔn)的明確;第二階段為單元測(cè)試執(zhí)行前,對(duì)象為測(cè)試執(zhí)行者,培訓(xùn)內(nèi)容為具體單元測(cè)試的執(zhí)行,包括驅(qū)動(dòng)函數(shù)、樁函數(shù)的構(gòu)造、覆蓋率測(cè)試工具的使用( TrueCoverage 、 Logiscope 等)、利用自動(dòng)化單元測(cè)試框架構(gòu)造單元測(cè)試自動(dòng)化( TCL 、 CppUnit 、Junit等)。培訓(xùn)過(guò)程中最好結(jié)合實(shí)例穿插其中,會(huì)比較生動(dòng),而且增強(qiáng)理解。
通過(guò)以上的系統(tǒng)培訓(xùn),可以統(tǒng)一單元測(cè)試方法、明確單元測(cè)試的標(biāo)準(zhǔn)、掌握單元測(cè)試基本技能,為后期單元測(cè)試的順利開展掃平道路。
2 .必須引入工具進(jìn)行輔助
單元測(cè)試非常需要工具的幫助,特別是覆蓋率工具不能缺少,否則用例執(zhí)行后無(wú)法得到測(cè)試質(zhì)量如語(yǔ)句覆蓋、路徑覆蓋等情況,也就無(wú)法對(duì)被測(cè)對(duì)象進(jìn)行進(jìn)一步的分析。應(yīng)用較廣的分析覆蓋率的工具有 Logiscope 、 TrueCoverage 、 PureCoverage 等,它們的功能有強(qiáng)有弱,可以根據(jù)實(shí)際情況采用。
為了提高單元測(cè)試的效率,特別是提高進(jìn)行回歸測(cè)試時(shí)的效率,需要在單元測(cè)試中引入自動(dòng)化。目前常用的方法是采用 TCL 語(yǔ)言編寫擴(kuò)展指令,構(gòu)造自己的單元測(cè)試自動(dòng)化。也可以直接采用開源的自動(dòng)化測(cè)試框架如 CppUnit 、 JUnit 等。
此外,在單元測(cè)試之前,還需要利用 PC_Lint 對(duì)被測(cè)代碼進(jìn)行檢查,排除代碼語(yǔ)法錯(cuò)誤,確保進(jìn)行單元測(cè)試的代碼已經(jīng)具備了基本質(zhì)量,保證單元測(cè)試能夠順利進(jìn)行,提高單元測(cè)試執(zhí)行效率。
3 .單元測(cè)試者加強(qiáng)對(duì)被測(cè)軟件的全面了解
單元測(cè)試的目的除了要發(fā)現(xiàn)編碼中引入的錯(cuò)誤和發(fā)現(xiàn)代碼與詳細(xì)設(shè)計(jì)不一致的地方之外,還有一個(gè)目的是為了保證詳細(xì)設(shè)計(jì)的質(zhì)量。因?yàn)闇y(cè)試分析和測(cè)試用例設(shè)計(jì)需要依據(jù)詳細(xì)設(shè)計(jì)來(lái)進(jìn)行,這個(gè)過(guò)程實(shí)際上是對(duì)詳細(xì)設(shè)計(jì)的重新檢視,在這個(gè)過(guò)程中會(huì)發(fā)現(xiàn)以前評(píng)審中沒有發(fā)現(xiàn)的問題。
無(wú)論是在單元測(cè)試的設(shè)計(jì)活動(dòng)中還是在單元測(cè)試的執(zhí)行過(guò)程中,都需要測(cè)試者了解軟件的需求和概要,加強(qiáng)對(duì)被測(cè)軟件的全面了解。否則對(duì)被測(cè)對(duì)象了解不深,只能就被測(cè)單元的流程而測(cè)流程,而對(duì)于該流程是否正確就無(wú)法保證了。
測(cè)試者要注重與開發(fā)的交流,這樣能對(duì)被測(cè)單元有更深的了解;同時(shí)因?yàn)檫M(jìn)度的原因,包括詳設(shè)在內(nèi)的文檔往往來(lái)不及更新,所以最新最正確的思想往往存在于開發(fā)人員的腦袋里,及時(shí)與他們交流才會(huì)獲得最及時(shí)的信息,減少將來(lái)更新用例的工作量。
結(jié)語(yǔ)
單元測(cè)試是軟件開發(fā)過(guò)程中非常重要的質(zhì)量保證手段,加強(qiáng)單元測(cè)試對(duì)提高軟件質(zhì)量具有非常重要的意義。而做好單元測(cè)試不是只要掌握單元測(cè)試方法就可以了的,這需要從組織、流程和技術(shù)三個(gè)方面來(lái)保證。
原文地址:http://www.guojf.com/cat_4/17.html
【編輯推薦】