
摘要:很多軟件測試課程實踐部分是讓學生使用一些過時的工具對一些小型的例子程序進行測試,學生收獲不大。文章描述軟件測試課程中實踐項目的設計,包括實驗目的、涉及的知識點、使用的工具、被測系統等,闡述這些實踐項目的優勢并展示教學效果。
關鍵詞:軟件測試;實踐教學;項目設計;課程改革
引言
軟件測試是軟件工程知識體系的一個重要組成部分。四川大學軟件學院從2008年開始為本科學生開設軟件測試課程,目的是使學生系統地掌握軟件測試的基本概念和技術,培養學生的軟件質量意識,提高學生在軟件開發中的綜合能力,進一步幫助學生在軟件開發中減少缺陷的產生。
為了提高學生學習該門課程的興趣,全面提高學生的實踐能力,從2013年開始,課程組對實踐教學環節進行建設和改革,通過參考國內外眾多大學和培訓機構的軟件測試課程實踐教學內容,結合實際情況,建設完成了一套完整的課程實踐體系。實踐項目設計的主要目標是真實:一是使用真實的、企業級(或接近企業級)的測試工具;二是使用真實的被測系統(systems undertest,SUTs)。這樣可以使學生在學習本課程后,具有解決實際工作中軟件系統測試問題的能力。
1 課程特點及實踐教學存在的問題
1.1 軟件測試課程的特點
(1)基本概念多。軟件測試知識體系中基本概念繁多,如單元測試、集成測試、系統測試、黑盒測試、白盒測試、回歸測試、配置測試等。這些概念是課程的基礎,學生必須首先弄清這些概念的含義。實際上,對于每個教師來說,要把各個概念解釋清楚并不困難,令學生聽懂也不難,但是很多學生在課堂上學習完這些概念后,很快就忘記各個概念的含義和區別,也就是說這些概念沒有變成他們真正掌握的知識,其主要原因是學生沒有通過實際動手加深對各個概念的理解,因此要想學好這門課,就必須重視課程的實踐部分。
(2)實踐性強。通過對實際系統的各種測試實踐,學生可以體會理論教學中的各種概念、技術和理論并實際使用各種測試技術和測試工具,這樣可以極大地加強對理論知識的掌握和理解。建設有效的實踐教學體系,對于提高軟件測試課程的教學效果很有必要。
1.2 實踐教學存在的問題
(1)學生不重視。很多學生對軟件測試的認識不夠,對軟件測試工作有一種錯誤觀念,認為編碼能力不夠的人才會去做軟件測試或者女生才適合做軟件測試。這樣導致的結果就是很多學生排斥該門課程,有的學生只是為了混學分才選這門課,對于實踐部分也是抱著蒙混過關的想法。
(2)內容陳舊。要求學生完成的實驗題目都是幾年前的,不能跟上軟件測試近幾年的發展。例如,只是使用手動方式進行黑盒測試,在Word或Excel中記錄測試結果,沒有任何自動化工具的使用,導致學生沒有興趣完成實驗。
(3)被測系統沒有實際意義。很多被測系統都是極小型的、只有幾十行代碼的實例程序,對學生能力的提高幫助不大。編寫一個幾十行代碼的系統與編寫一個上萬行代碼的系統相比,需要的技術天壤之別。同樣地,對于軟件測試來說,學生只有通過測試大型的實際系統,才能學會如何測試。
(4)測試工具不實用或不可得。以前軟件自動化測試工具很少且大多數是商用軟件,因此實踐項目設計中缺乏對自動化工具的使用。
(5)所用工具的廣度不夠。一些學校的軟件測試實踐教學中,只是讓學生練習使用單元測試工具,缺少其他流行的自動化測試工具的使用。
這些問題的存在使得學生學習完這門課后,實際能力沒有本質上的提高,直接導致學生進行實際軟件測試時不知道如何下手進行測試。
2 主要實踐項目介紹
課程實踐的主要目的是使學生在有限的實驗時間內,通過理論結合實際,提高實踐動手能力。實驗題目選擇的原則是體現基礎性和前沿性,參考國內外著名大學的課程體系和教學內容,密切結合軟件測試技術的最新發展。
在設計實驗題目時,教師應主要考慮如下4個因素:①覆蓋面。不一定大而全,但要覆蓋重點需要掌握的一些知識點。②實用性。所使用的工具應是業界或接近業界所用工具,使學生通過實驗能夠感受到企業級的軟件測試。③綜合性。在有限的幾個實驗中,綜合課程的多個知識點。④工作量。實驗基本內容設計應難度適中和循序漸進,另外還可設計一些加分內容,難度原則是使學生“跳起來夠得著”。具體來講,70%的學生能夠在課內完成基本實驗;10%左右能力差的學生需要課外自己找時間完成;20%左右能力強的學生可以在課內完成基本實驗和加分實驗內容。
實驗工具盡量選擇開源軟件工具。近幾年,隨著開源軟件的普及,越來越多開源、實用的自動化軟件測試工具出現。很多工具在業界得到廣泛使用和好評,如JUnit、EcIEMMA、BugZilla等。實驗項目中大多數使用的是開源軟件工具。最早的實驗項目主要借鑒Vahid Garousi博士開設的軟件測試實驗課內容。在2013年和2014年兩次使用后,我們根據學生的成績情況和反饋、工具的可用性等進行修改,最終確定如下5個實驗項目:①動態黑盒測試;②靜態白盒測試;③單元測試;④Web測試;⑤測試覆蓋率。
軟件測試課程的實驗課為16學時(2學時/次×8次)。實驗①③④分別用2次實驗課完成,實驗②⑤分別用1次實驗課完成。這幾個實驗覆蓋了理論課學習中主要要求掌握的知識點。
2.1 實驗項目介紹
1)實驗1:動態黑盒測試。
實驗目的:了解軟件測試的幾個基本概念,包括黑盒測試、隨機測試、回歸測試、測試用例、手工測試、缺陷的生命周期等;通過使用缺陷記錄工具BugZilla,了解業界對于缺陷管理的過程。
知識點:重點是黑盒測試,其他還有測試用例、回歸測試、缺陷生命周期等。
使用的工具:開源工具BugZilla。
被測系統:ATM模擬系統。
2)實驗2:靜態白盒測試。
實驗目的:在業界,靜態白盒測試是高級的缺陷查找技術。靜態白盒測試能夠找出一些特殊的缺陷,這些缺陷是大多數編譯器不能發現的,也是程序員進行人工代碼檢查時不容易發現的;有的缺陷是動態軟件測試也很難發現的,如內存泄漏。該實驗能夠讓學生理解靜態白盒測試的重要性,使用靜態測試工具進行代碼靜態分析并理解靜態分析工具所得結果。
知識點:重點是靜態白盒測試,其他還有代碼分析、代碼復雜度等。
使用的工具:商業工具PC-Lint,實驗使用的是此工具的網頁試用版本。
被測系統:學生在學習C/C++程序設計課程時編寫的代碼或者在開發其他項目時自己編寫的代碼。
對自己的代碼進行檢測,每個學生都很有興趣;特別是發現原本編譯和運行正確的代碼居然還有錯誤時,大多數學生感觸很深。
3)實驗3:單元測試。
實驗目的:JUnit是目前業界使用最為廣泛的應用于Java的單元測試工具。JUnit框架允許開發人員快速、輕松地創建單元測試和測試套件。該實驗讓學生熟悉單元測試的基本概念和技術,學習使用JUnit進行單元測試用例的編寫。
知識點:重點是單元測試,其他還有驅動模塊、樁模塊、測試套件、斷言、測試Oracle等。
使用的工具:開源工具JUnit。
被測系統:JFreeChart,是Java平臺上一個開源的圖表繪制類庫。實驗中選取其中2個類的10個方法進行測試。
4)實驗4:Web測試。
實驗目的:目前大量系統是Web應用系統,了解這類系統的測試技術,對于學生日后的實際工作有很大幫助。該實驗讓學生熟悉Web應用程序的功能測試過程,同時熟悉“錄制一回放”類測試工具的基本操作,為以后進行GUI程序測試奠定基礎。
知識點:重點是Web測試,其他還有GUI測試、測試腳本等。
使用的工具:開源工具Selenium。
被測系統:學生自己選擇熟悉的網站,如百度、淘寶、學校的課程中心等。
5)實驗5:測試覆蓋率。
實驗目的:測試覆蓋率是度量測試完整性的一個重要手段,是測試有效性的一個度量。通過該實驗,加深學生對于測試度量和測試覆蓋的理解,幫助學生回答測試的“完全程度如何”;同時讓學生體會為了達到盡量完全的測試,應該如何編寫有效的測試用例。
知識點:重點是測試度量和測試覆蓋率,其他還有單元測試,語句覆蓋、分支覆蓋、條件覆蓋等不同的覆蓋準則。
使用的工具:開源工具EcIEMMA。
被測系統:JFreeChart。
該實驗要求學生基于實驗3的結果,查看自己所寫測試用例的覆蓋情況,然后基于規定的測試覆蓋率要求,增加相應的測試用例。
2.2 實驗成績評定
在布置每個實驗時,教師除了詳細地指導實驗,還應公布詳細的評分標準,讓學生知道哪些地方是得分點。教師進行評定時,要嚴格執行評分標準。成績公布后一周內,學生可以對自己的分數提出異議并與教師溝通。每個實驗的分數由實際操作和實驗報告兩部分構成。對于每個實驗報告,教師給出基本框架,這樣可以令格式統一,也可以讓學生清楚各實驗的重點在哪里。學生的最后得分由實驗室操作、測試用例編寫、實驗報告3部分組成。每一部分的要求和分數分布都要詳細給出。單元測試評分標準如下。
1)實驗室操作(10%)。
在實驗室內完成所有實驗步驟并可以運行自己寫的測試腳本。
2)測試用例開發(50%)。
在課程網站中提交自己開發的10個JUnit測試用例,每個用例5分,評分標準如下:清晰(代碼格式規范,可讀性好),占1%;與需求一致(只測試需求中描述的功能),占1.5%;完整(測試需求中描述的所有內容),占1.5%;正確(測試真正需要測試的屬性),占1%。
3)實驗報告(40%)。
請根據給出的實驗報告模板撰寫實驗報告,你可以根據自己的情況,修改其中的部分標題內容。要求報告中至少包括如下內容:引言,占5%;測試用例描述,占25%;測試時遇到的困難或挑戰,占3%;實驗的收獲或結論,占3%;意見和建議(該實驗有用嗎?能否根據實驗指導完成?實驗時間太多/太少嗎?你還希望增加/減少什么內容),占4%。
3 使用效果分析
所設計的實驗項目在2013年和2014年春季學期軟件測試課程中使用,面向的是本科3年級學生,分別是143名和80名學生。學生已經學習過C/C++/Java程序設計、軟件工程、數據結構等大多數專業基礎課程,具有小型程序開發設計經歷;少量學生已開發過一些實際的軟件項目,在軟件工程課程中學習了軟件測試的基本概念。期末統計實驗成績各分數段比例,結果見表1。
可以看出,2013年成績總體偏低,原因是部分實驗難度和工作量偏大;2014年進行了調整,成績有很大提升,基本符合教學預期,其中發現靜態白盒測試的難度偏低,目前已進行了調整。 從學生反饋的情況看,大部分學生對于實驗的難度、工作量、獲得的能力等比較滿意,當然也提出一些很好的改進建議。
4 結語
筆者根據近幾年的教學經驗,對軟件測試課程實踐教學環節存在的問題進行分析,介紹了所設計的實驗項目情況,提出了相應的改革措施。從實際的使用效果看,達到了讓學生鞏固理論知識和提高動手能力的目標,提高了教學質量,在教學實施過程中取得很好的效果,激發了學生的學習興趣,為軟件測試課程的實踐教學環節提供參考。目前的實驗設計并非完美,在以后的教學中,還有一些問題需要解決。
(1)前沿性不夠。一些新型應用不斷普及,但實驗項目中沒有針對這些應用的測試,如移動應用測試、云測試等。
(2)覆蓋面不夠。性能測試、配置測試等都是教學主要內容,但由于課程的實踐時間有限,沒有設計這方面的測試內容。
(3)理論性不夠。所設計的實驗題目側重于簡單的動手實踐,沒有能夠讓學生在理論上進一步提高的內容。
(4)部分工具功能有限。所選用的工具與商業工具相比,在功能及性能上還有一定差距。例如PC-Lint,實驗使用的只是其網上試用版本,功能很有限,不能很好地體現靜態白盒測試的某些功能。