譚學芹
(廣州軟件學院 廣東·廣州 510980)
在一個項目中,程序開發(fā)出來后,首先就要進行單元測試,在單元測試過程中,有一部分是本身程序開發(fā)人員進行操作,另外一部分屬于軟件測試人員進行操作的。但至于劃分哪些單元測試是由測試人員去進行,哪些由開發(fā)人員去進行呢?業(yè)界其實一直都有一定的爭論,在平常開課中,一般都認為單元測試只是軟件測試方向人員所做的工作,但只要上網(wǎng)搜索一下相關資料,不難發(fā)現(xiàn),單元測試其實做得最多卻是軟件開發(fā)人員,至于測試人員,一般都是軟件開發(fā)差不多時,才進行介入,主要做集成方面的測試。由此,開設單元測試課程中,就已經(jīng)進入一個誤區(qū),為了搞清楚弄明白這個誤區(qū),應該要對單元測試課程進行深入的企業(yè)調查研究,針對社會上實際需求進行單元測試課程改革。
單元測試一般都是針對源代碼的測試,在單元測試中,有一些測試原則需要遵循。第一個原則是盡可能保證各個測試用例是互相獨立的,應該避免在測試類中調用其他依賴的類。第二個原則是一般由代碼的開發(fā)人員來實施,用以檢驗所開發(fā)的代碼功能符合自己的設計要求。[1]就是實施單元測試的人需要對被測試的模塊代碼有相當程度的了解。
在軟件測試的不同階段當中,單元測試是個非常重要的階段,可以說是其他測試階段的基礎,單元測試有很多好處。第一個好處是通過單元測試能盡早發(fā)現(xiàn)缺陷,在測試的前期能夠發(fā)現(xiàn)更多的缺陷,而且收益是更高的。第二個好處是有利于重構,通過實施單元測試有利于重構,進行了完善的單元測試就能夠最大限度地保證后面的重構的正確性,且可以快速識別出重構時出現(xiàn)的問題。第三個優(yōu)點是簡化集成,單元測試保證最小單元模塊的穩(wěn)定性和正確性,為我們后面的集成測試奠定了基礎。第四個優(yōu)點是文檔,單元測試包括了對模塊的基本理解和特性,如果單元測試比較規(guī)范,通過對它的閱讀,就能夠基本了解到這個模塊的特性,單元測試就相當于文檔。第五個優(yōu)點是用于設計,通過編寫單元測試,可以把設計思路體現(xiàn)在單元測試的組織當中。[3]由此可見,單元測試做得好與否,將會直接關系到項目是否完善,對于項目日后bug追溯起到很重要的作用。
優(yōu)點:開發(fā)對代碼最熟悉,而且開發(fā)技能也強,開發(fā)自己寫單元測試效率上和覆蓋率上都比較高。而且單元測試有時候需要開發(fā)對代碼進行部分重構才方便進行,開發(fā)自己做這些重構也比較順手。
缺點:開發(fā)平時寫業(yè)務代碼就忙不過來了,哪有時間寫單元測試?而且大部分開發(fā)沒有太好的測試思想,單元測試可能只是寫個最簡單的用例就完了,最終可能單元測試通過,但基本的功能還是有問題,這樣的單測沒有太大作用。
優(yōu)點:測試有比較好的測試思想,可以更好地保證用例的覆蓋。而且通過寫單元測試能更好地了解具體代碼結構、流程,對于后續(xù)的業(yè)務測試也有利。
缺點:有比較好代碼能力的測試人員不多,而且測試對代碼沒有開發(fā)熟悉,遇上為了可測性需要重構的時候還是得開發(fā)花時間配合。效率上不如開發(fā)自己寫。
(1)必須清楚單元測試中要做的所有工作,列出具體內容,同時,也列舉出要用的相關的知識點,列舉出在哪個時間段進行的。
(2)明確軟件開發(fā)與軟件測試的目標,必須清楚一般情況下,哪部分是由軟件開發(fā)人員做的,哪部分是由測試人員做的,分工應該如何進行配合,如何才能做到最佳的配合。
(3)弄清楚各自的測試計劃,這樣對各自的職責都是明確的,有利于系統(tǒng)順利地進行開發(fā)及完成。
(4)如果存在相關重復的,應該如何劃分責任。如果存在互不相關,但又必須要做,又如何進行重新分工。
(5)如何將測試結果進行相互共享,相互進行改進,最終形成一個共同的單元測試報告。
鑒于軟件開發(fā)人員最熟悉代碼,且開發(fā)能力強,在單元測試分工中,會更多的做邏輯性更強、應用性更強的單元測試任務:
(1)粗粒度測試。隔離測試是單元測試的核心,隔離測試包括粗粒度測試和細粒度測試,粗粒度測試構建的依賴部件是一個比較大的模塊,比如Web服務器、文件系統(tǒng)或者數(shù)據(jù)庫等。通過stub技術來做粗粒度測試,寫出的stub替代代碼需要有詳細的邏輯處理,因此這種粗粒度隔離測試比較適合開發(fā)人員來完成。
(2)服務器端應用測試。組件測試是軟件項目軟件質量控制不可缺少的一個環(huán)節(jié),對組件進行單元測試要難于對普通Java類進行單元測試,這是因為組件要與它們的容器打交道。容器內單元測試通常使用Cactus框架在容器內運行測試[5]。因為要進行容器內單元測試,需要深入理解組件、容器等相關的知識,所以是比較適合軟件開發(fā)人員來進行這一塊的單元測試。
(3)數(shù)據(jù)庫訪問測試。數(shù)據(jù)庫訪問代碼毫無疑問是任何企業(yè)項目中最重要的部分之一,在實際測試中采用DbUnit工具對Java應用程序的數(shù)據(jù)庫訪問代碼進行單元測試。只要掌握數(shù)據(jù)庫訪問相關知識和DbUnit工具的使用,就可以勝任數(shù)據(jù)庫訪問的單元測試任務。軟件開發(fā)人員和測試人員均可以承擔這部分的測試任務。
軟件測試人員相對開發(fā)人員來說,代碼能力相對弱些,但是有很好的測試思想,針對不需要有非常好的代碼能力的單元測試任務比較適合軟件測試人員來做:
(1)隔離測試中的細粒度測試。細粒度測試指主要測試對象依賴其他類對象的場景,按照單元測試的隔離思想,在測試主要測試對象的時候,會創(chuàng)建模擬的對象來代替依賴的對象。在做這種細粒度測試通常采用 mock框架如EasyMock借助一些簡單的方法動態(tài)生成依賴對象,這個過程不需要手工創(chuàng)建模擬類,代碼量比較小,比較適合軟件測試人員完成這一部分的單元測試任務。
(2)數(shù)據(jù)庫訪問測試。只要軟件測試人員掌握數(shù)據(jù)庫訪問相關知識并會使用專門用于數(shù)據(jù)庫訪問單元測試的工具DbUnit,完全可以和開發(fā)人員合理分工一起完成應用程序的數(shù)據(jù)庫訪問測試任務。
(3)基于Parasoft Jtest單元測試工具進行單元測試。Parasoft Jtest是為Java EE、Web及其他Java應用程序的開發(fā)團隊量身定做的一款全面測試Java程序的工具,可以自動查找隱藏的運行缺陷、自動代碼檢測、自動生成高質量的測試用例集合發(fā)現(xiàn)盡可能多的結構性錯誤等,通過該工具可以很方便的進行單元自動化測試[4]。軟件測試人員通過相關學習掌握Parasoft Jtest工具的使用,且該工具不需要編寫測試腳本或測試用例,適合測試人員去完成這部分測試工作。
(4)單元測試框架與構建工具的集成。通過構建工具,可以實現(xiàn)代碼編譯、打包、測試、部署等一系列過程實現(xiàn)自動化,可以有效的節(jié)約開發(fā)人員或者測試人員在這一系列過程中所耗費的時間。在進行持續(xù)集成構建過程,通常將Junit與構建工具Ant與Maven進行集成。通過Ant可以將測試作為Ant構建生命周期中的一部分來啟動,并且可以根據(jù)Junit的執(zhí)行結果生成一些特定的報告。通過Maven可以在Maven構建生命周期中包含測試的執(zhí)行還可以使用Maven插件生成HTML報告[5]。關于單元測試框架與構建工具的集成,軟件測試人員可以進行。
在敏捷開發(fā)的時代,強調團隊內部的協(xié)作。單元測試是要求開發(fā)人員與測試人員相互配合才能完成的,各自完成各自的任務,甚至有些測試任務兩者還可以合作完成,故在改革過程中,應該在此課程改革中要進行仔細研究一般哪部分是屬于軟件開發(fā)要做的工作,哪部分是屬于軟件測試方面的工作,只有做好這方面的改革工作,才能讓整個項目系統(tǒng)開發(fā)過程變得更加成熟穩(wěn)重,系統(tǒng)才能變得更加規(guī)范。