測試驅(qū)動開發(fā)技術(shù)作為軟件敏捷開發(fā)中的一個重要組成部分,在軟件開發(fā)實踐中得到了廣泛的應(yīng)用。本質(zhì)上,測試驅(qū)動開發(fā)技術(shù)是一種軟件開發(fā)技術(shù),而不是一種軟件測試技術(shù),它的作用在于通過測試來驅(qū)動開發(fā),以提高軟件的高內(nèi)聚、低耦合程度,改善軟件設(shè)計質(zhì)量,減少軟件代碼中的缺陷率,提高軟件開發(fā)的效率,提升軟件產(chǎn)品的質(zhì)量。
《航天標準化》(季刊)創(chuàng)刊于1983年,由中國航天標準化研究所主辦。以從事航天行業(yè)的技術(shù)領(lǐng)導(dǎo)和廣大的工程技術(shù)、科技管理和標準化專業(yè)人員為主要閱讀對象。期刊以宣傳國家和行業(yè)的標準化工作方針和政策、貫徹技術(shù)民主與爭鳴的原則,以嚴謹?shù)膽B(tài)度開展標準化理論研究,研究市場經(jīng)濟下標準化工作發(fā)展方向及工作方法,探討型號研制標準化及產(chǎn)品三化等的意義和作用,目的是促進航天事業(yè)的技術(shù)進步和發(fā)展、實現(xiàn)國防現(xiàn)代化、趕超世界先進水平。
測試驅(qū)動開發(fā)技術(shù)相對于傳統(tǒng)的軟件開發(fā)流程,是一種開發(fā)思維上的轉(zhuǎn)變。它是一種基于目標驅(qū)動的軟件開發(fā)思想,與傳統(tǒng)的先編寫代碼再進行調(diào)試的開發(fā)流程不同,強調(diào)在編寫產(chǎn)品代碼之前先思考作為用戶該如何去使用這個功能,先確定如何去用這個目標,并通過測試代碼使目標明確可運行,之后再去思考如何實現(xiàn)這個功能,需要開發(fā)人員在用戶與功能開發(fā)者之間不斷進行角色切換,多角度思考。先編寫測試代碼,再編寫產(chǎn)品代碼,用測試來驅(qū)動開發(fā)。
測試驅(qū)動開發(fā)技術(shù)是隨著敏捷開發(fā)技術(shù)不斷發(fā)展應(yīng)用起來的,敏捷開發(fā)除了測試驅(qū)動之外,還包括用戶故事、結(jié)對編程、持續(xù)集成等要素。本文不針對測試驅(qū)動開發(fā)在敏捷開發(fā)中的實踐,而是將測試驅(qū)動開發(fā)技術(shù)應(yīng)用于傳統(tǒng)的軟件開發(fā),與傳統(tǒng)的領(lǐng)域開發(fā)流程相結(jié)合,介紹測試驅(qū)動開發(fā)技術(shù)在領(lǐng)域應(yīng)用中的實踐。
1 測試驅(qū)動開發(fā)
本節(jié)介紹測試驅(qū)動開發(fā)的概念及測試驅(qū)動開發(fā)所起到的作用。
1.1 測試驅(qū)動開發(fā)概念
測試驅(qū)動開發(fā)技術(shù)是由Kent Beck于20世紀90年代提出并不斷發(fā)展起來的,基本方法是編寫所有產(chǎn)品代碼的目的都是為了使失敗的測試能夠通過。首先編寫一個測試,由于它要運行的功能還不存在,所以它會運行失敗。然后,編寫產(chǎn)品代碼使測試通過。作為結(jié)果,一個非常完整的測試用例集就和產(chǎn)品代碼一起發(fā)展起來。軟件重構(gòu)、領(lǐng)域驅(qū)動設(shè)計、敏捷軟件開發(fā)與實踐等技術(shù)或?qū)嵺`均將測試驅(qū)動開發(fā)作為一個必要條件和實踐原則,它們的一個共同特點是均采用迭代開發(fā)思想,在開發(fā)過程中不斷對已有產(chǎn)品進行精化和完善。軟件重構(gòu)關(guān)注改善既有代碼的設(shè)計,從代碼層面不斷對軟件進行優(yōu)化,使代碼結(jié)構(gòu)更合理、擴展性更好,可理解性更強。領(lǐng)域驅(qū)動設(shè)計關(guān)注領(lǐng)域模型與代碼實現(xiàn)的綁定,強調(diào)軟件各個部分的設(shè)計應(yīng)忠實地反映領(lǐng)域模型,與模型相對應(yīng),在開發(fā)過程中通過不斷的重構(gòu)與精煉去獲得和實現(xiàn)深層次的領(lǐng)域模型。敏捷軟件開發(fā)與實踐將測試驅(qū)動開發(fā)作為一個基礎(chǔ)實踐,與其他實踐結(jié)合形成一個完整的迭代開發(fā)流程。
1.2 設(shè)計作用
測試驅(qū)動開發(fā)要求在編寫產(chǎn)品代碼之前先編寫測試,開發(fā)人員首先必須站在產(chǎn)品代碼使用者的角度去思考應(yīng)該怎么去使用這個功能,這個功能應(yīng)該提供哪些接口供測試代碼來訪問,這種思考方式會促使開發(fā)人員先從接口的角度考慮功能模塊的設(shè)計,促進功能模塊的接口設(shè)計的正確性與合理性,同時會激發(fā)開發(fā)人員去解除各個功能模塊之間的耦合,這樣才能夠?qū)Ω鞴δ苣K進行獨立的測試,形成高內(nèi)聚、低耦合的軟件設(shè)計與實現(xiàn)。從一定程度上說,編程就是設(shè)計,測試驅(qū)動開發(fā)可以實現(xiàn)更好的設(shè)計。
1.3 文檔作用
測試驅(qū)動開發(fā)的第二個作用是提供精確的功能模塊使用說明文檔。隨著測試驅(qū)動開發(fā)過程的不斷進行,會建立起一套非常完整的測試用例集,該用例集精確的描述了各個功能模塊的使用方法,功能模塊的使用者通過測試用例可以準確的查看功能模塊的接口及其使用方法,明確功能模塊需要的前置條件及執(zhí)行結(jié)果的后置條件,更好的理解模塊的功能和作用。從一定程度上說,源代碼就是文檔,測試代碼可以提供更準確、可驗證的模塊使用說明文檔。
1.4 測試作用
測試驅(qū)動開發(fā)的第三個作用是測試,測試集是隨著開發(fā)過程不斷建立起來的,且均是先編寫測試代碼,后編寫產(chǎn)品代碼,通過這套完整的可運行的測試用例集,可以隨時對產(chǎn)品代碼運行測試用例,對開發(fā)過程中運行的所有測試實現(xiàn)可重復(fù)的自動化的運行,因此從開發(fā)人員角度考慮,可以認為產(chǎn)品代碼的正確性與測試用例是否全部通過是等價的。同時開發(fā)人員工作是否完成的標志從編譯是否正確變成了測試用例是否全部通過。
1.5 基礎(chǔ)設(shè)施作用
一個優(yōu)秀的軟件架構(gòu)和軟件產(chǎn)品的產(chǎn)生,需要結(jié)合應(yīng)用領(lǐng)域不斷的進行實踐、重構(gòu)、優(yōu)化,包括代碼級別的重構(gòu)、設(shè)計模式級別的重構(gòu)、領(lǐng)域模型的重構(gòu)及軟件架構(gòu)的重構(gòu)。對一個軟件架構(gòu)或產(chǎn)品不斷進行不同級別的各種重構(gòu),勢必會對已經(jīng)可以正常工作的軟件代碼造成很大的影響,引入各種各樣的軟件Bug,這也是很多開發(fā)人員不愿意或沒有勇氣對已有軟件進行重構(gòu)或調(diào)整的原因。而測試驅(qū)動開發(fā)技術(shù)可以很好的解決這個問題,將測試驅(qū)動開發(fā)產(chǎn)生的測試代碼作為軟件產(chǎn)品開發(fā)的一個重要組成部分與基礎(chǔ)設(shè)施,一定程度上,軟件的正確性與測試是否全部通過是等價的。在重構(gòu)的過程中不斷進行測試,如果因重構(gòu)引出問題,測試結(jié)果會立刻顯示出來,由于每一步的重構(gòu)動作都是很小的一步,且剛剛進行過修改,印象深刻,結(jié)合有問題的測試用例,可以很快地定位問題的原因,確保在不影響軟件正確性的前提下,軟件的各類重構(gòu)能夠有序進行。
2 航天領(lǐng)域應(yīng)用實踐
航天領(lǐng)域作為一個高風險的行業(yè),對應(yīng)用軟件的正確性與可靠性提出了更高的要求,要既能滿足航天工程所需的軟件需求及其變更,又要確保軟件的正確性與可靠性。測試驅(qū)動開發(fā)技術(shù)作為軟件開發(fā)活動中的一個優(yōu)秀實踐,可有效提高航天領(lǐng)域軟件產(chǎn)品的正確性與可靠性。
2.1 工程實踐
測試驅(qū)動開發(fā)的工程實踐包括學習測試框架、搭建測試環(huán)境、實施測試驅(qū)動開發(fā)等步驟。測試驅(qū)動開發(fā)的實踐原則是非常簡單的,重要的是開發(fā)人員要從思想上接受這種模式并通過不斷的訓練,使測試驅(qū)動開發(fā)技術(shù)真正融入到日常的軟件開發(fā)活動中。
2.2 學習測試框架
要應(yīng)用測試驅(qū)動開發(fā)技術(shù),首先必須學習一些常用的測試框架及測試的方法。目前C++、Java、C#等主流的程序開發(fā)語言都有優(yōu)秀且開源的測試框架,如xUnit系列測試框架支持Java、C#、C++等語言的測試,GTest是一個支持C++語言的跨平臺的測試框架,提供了支持測試的各項功能。另外,還需要學習對測試框架的初始化、測試用例的建立與退出、支持各種數(shù)據(jù)類型的聲明和斷言。當然,測試框架也不是必須的,在沒有可直接使用的測試框架的條件下,自己也可以開發(fā)一個簡單測試環(huán)境,重要的還是測試驅(qū)動開發(fā)的思想。
2.3 搭建測試環(huán)境
原則上,測試代碼一般作為一個獨立的可運行的測試項目,與產(chǎn)品代碼所在項目保持獨立。在真正的產(chǎn)品代碼開發(fā)之前,先把測試項目運行起來,然后通過編寫測試驅(qū)動產(chǎn)品代碼的編寫。測試代碼項目隨著產(chǎn)品代碼項目不斷發(fā)展,形成一套完整的測試集。
2.4 實施測試驅(qū)動開發(fā)
測試驅(qū)動開發(fā)的基本的實施步驟是,首先編寫一個測試,由于它要運行的功能還不存在,所以它會運行失敗。然后,編寫產(chǎn)品代碼使測試通過。每次編寫的產(chǎn)品代碼只需要確保測試能夠通過。在切換到測試代碼的編寫,重復(fù)此過程。一般測試代碼與產(chǎn)品代碼的切換非???,通過“編寫測試代碼→運行測試失敗→編寫產(chǎn)品代碼→運行測試成功→重構(gòu)”的循環(huán)模式,推進軟件產(chǎn)品的開發(fā)過程。
2.5 訓練方式
要將測試驅(qū)動開發(fā)技術(shù)真正應(yīng)用于開發(fā)實踐,使其成為軟件開發(fā)人員開發(fā)思想的一個必不可少的組成部分,需要進行有效的訓練和刻意的練習,整個過程可分為三個階段:第一階段,強迫自己先寫測試代碼,再寫產(chǎn)品代碼;第二階段,在實踐中應(yīng)用,有時可能會無意識地轉(zhuǎn)換回傳統(tǒng)的軟件開發(fā)流程,直接去編寫產(chǎn)品代碼,在開發(fā)過程中,當意識到這段產(chǎn)品代碼還沒有編寫測試時,應(yīng)馬上停下來,補充相應(yīng)的測試代碼,有意識的不斷訓練;第三階段,會自覺的先編寫測試代碼,再編寫產(chǎn)品代碼,如果某一時刻直接去編寫產(chǎn)品代碼,自己會覺得很不舒服,感覺缺少了什么東西或?qū)κ裁词虑椴环判模瑫⒖桃庾R到應(yīng)該去編寫測試代碼。到該階段,測試驅(qū)動開發(fā)的思想會真正融入到開發(fā)人員的開發(fā)思維中,形成一種自覺的開發(fā)行為模式。
2.6 效率問題
剛開始接觸測試驅(qū)動開發(fā)的人員都會有編寫測試會不會降低開發(fā)效率的問題。傳統(tǒng)的軟件開發(fā)模式中,編碼與調(diào)試所耗費開發(fā)人員時間的比例一般為1∶3,調(diào)試會占用開發(fā)人員大量的時間,耗費開發(fā)人員的精力。測試驅(qū)動開發(fā)技術(shù)會徹底改變這種傳統(tǒng)的工作模式,通過不斷編寫測試用例、頻繁的運行測試,幾乎不再需要進行軟件調(diào)試的工作,即使需要調(diào)試,也會很快定位并解決問題,因此測試驅(qū)動開發(fā)會很大地提高軟件開發(fā)的效率。
3 結(jié)語
本文介紹了將測試驅(qū)動開發(fā)技術(shù)應(yīng)用于傳統(tǒng)的軟件開發(fā)流程,并詳細介紹了測試驅(qū)動開發(fā)在航天工程領(lǐng)域的應(yīng)用實踐,應(yīng)用結(jié)果表明,測試驅(qū)動開發(fā)可以有效提高航天軟件的開發(fā)效率,確保軟件的正確性與可靠性,提升軟件質(zhì)量,促進航天軟件的產(chǎn)品化。
論文指導(dǎo) >
SCI期刊推薦 >
論文常見問題 >
SCI常見問題 >