張戰成,陸衛忠,任建平,付保川
(蘇州科技學院 電子與信息工程學院,江蘇 蘇州 215009)
隨著軟件規模和復雜性的增長,軟件產品的質量逐步引起了客戶和軟件公司的重視,向用戶交付高質量的軟件產品已成為各方的共識。一套清晰嚴格受控的軟件過程是高質量軟件產品的基本保障,其中軟件測試是軟件質量保證中最重要的一個環節。企業對軟件測試工程師的需求也與日俱增,為滿足企業對人才的需求,高校的課程設置、教學內容也需要與時俱進[1]。
傳統的軟件測試的教學內容是軟件工程課程的一個章節,在一門60課時的課程中一般占4~6個課時,這么短的課時僅夠介紹軟件測試的概貌,其教學內容的深度和廣度距離企業期待的既掌握扎實的軟件測試基本理論和測試方法,又具有一定的軟件測試經驗的測試人才的需求還有較大的差距[2]。為加強軟件測試人才的培養,各個高校開設了軟件測試課程,甚至單獨的軟件測試培養方向。
通過軟件缺陷的統計發現,不同的項目,不同的開發人員重復著同樣的Bug,甚至同一個人也重復相同的Bug,每一位新手都在重復前人走過的彎路,重復同樣的錯誤[3]。將這些共性的錯誤總結出來,提前學習和預防是軟件質量保證中重要的一個環節,與測試、缺陷定位修改、回歸測試的過程相比,其人力成本消耗低很多,是一種高效的軟件質量保證措施。國外已有相關的教材[4-6]對這類缺陷進行了很好的總結,并被列入業界的經典推薦書目。而國內現有的計算機程序設計的教學中僅僅注重編程語言自身的功能和特性,對于編程語言中存在的一些“陷阱”較少涉及。筆者從軟件質量保證的角度,嘗試在軟件測試課程的教學活動中,引入缺陷預防的內容,探索提高學生軟件綜合技能的教學新方法,以期為高素質的軟件人才培養起到促進作用。
軟件測試課程和軟件工程、軟件能力成熟度模型、設計模式、程序設計等課程有緊密的聯系。在傳統的V字型模型中,軟件測試過程伴隨著軟件的整個生命周期,在不同的階段有不同的側重點,例如:詳細設計和編碼階段引入的錯誤可以通過單元測試來發現,軟件進入維護期后,比較關注回歸測試和自動化測試。現有的軟件測試教材基本按照黑盒測試、白盒測試技術,V字形模型的各個測試階段來組織,這種教學方式使得學生“只見樹木,不見森林”。實際上在學習軟件測試計劃的制訂和管理的時候用的是軟件工程中項目管理的相關知識,針對不同的軟件規模,一些測試過程是可以裁減和合并的,這需要學生了解軟件能力成熟度模型的相關知識;每個階段需重點關注那一類缺陷實際上又需要有設計模式和程序設計的相關基礎知識。所以軟件測試一般安排在大學三年級開設,以保證學生能夠將先前的知識融會貫通,學好軟件測試。
學生認識上的誤區。傳統的認識將測試看成是“低等”的工作,沒有技術含量,認為畢業后從事軟件測試是沒有出息的工作,多數學生認為只有軟件開發才是計算機專業的主要工作。糾正學生的這些錯誤認識,一方面通過業界的一些行業調查數據來舉例說明軟件測試的重要性,另一方面,采取“以其人之道,還治其人之身”的策略,通過在測試的每個階段列舉一些軟件開發中容易犯的錯誤,并通過設計測試用例來發現這些缺陷,通過這些實例使得學生對軟件測試的重要性“心服口服”,增加自主學習的動力。
現有的測試案例缺少對缺陷預防的關注。軟件測試教材中經典的三角形測試、NextDate測試、保險金計算程序測試等經典案例主要訓練學生掌握邊界法、等價劃分法、決策表法等黑盒測試用例的設計方法。對于如何預防缺陷,雖然有些教材在測試概述章節提到了靜態測試和代碼評審,這部分內容如果單獨的介紹確實比較枯燥,但是如果將其穿插在軟件測試的具體案例中,則讓學生即學習了測試技能又提高了編程技能。
缺陷預防就是將缺陷消滅在萌芽狀態。按照凈室軟件工程的哲學:“通過在第一次正確地書寫代碼增量并在測試前驗證它們的正確性來避免對成本很高的錯誤消除過程的依賴”。而軟件測試屬于后來彌補型,產生缺陷之后再來修改,但是缺陷發現越晚,修改缺陷花費也就越大,所以軟件缺陷預防技術既是項目生命周期的早期消滅缺陷的一項重要措施,也是軟件測試所追求的最高境界。
根據軟件生命周期不同階段的特點,每個階段關注的預防內容也不同:需求階段重點關注需求理解的偏差、需求的遺漏;設計階段重點關注模塊接口消息的傳遞,資源的申請和釋放以及并發訪問;編碼階段重點關注函數內部邏輯判斷和編程語言自身的一些的陷阱。這些內容涉及軟件工程、設計模式、程序設計等課程,在這些課程的教學過程中,通常僅僅講授“正向”的內容,對于各階段容易犯的錯誤和相應的預防措施甚少涉及,而這部分內容正是從書本知識上升實戰技能必須掌握的知識。因為這個環節的缺失,軟件企業會抱怨剛從校園邁入職場的新人開發的軟件產品中缺陷率比較高,尤其是編碼階段引入的缺陷比較多,企業通常需要通過編程規范培訓、技術評審和代碼走讀等措施才能減少他們所犯的錯誤,在一定程度上增加了企業的人力成本,同時也造成了新員工的挫折感,影響開發團隊的士氣。
高質量的軟件開發和軟件測試是軟件質量保證的兩個方面。盡早發現和預防缺陷,并對這些缺陷分類統計和分析,不僅可以提高軟件質量,還可以為軟件過程的持續改進提供可靠的參考。所以,在軟件測試的教學活動中,除了介紹軟件測試的基本原理外,在每個測試階段介紹典型的缺陷,如編碼階段的缺陷有:數據引用錯誤、數據聲明錯誤、運算錯誤、比較錯誤、控制流程錯誤、接口錯誤、輸入/輸出錯誤等。針對每類缺陷,寫出一段含有這類缺陷的程序,結合具體的測試原理,設計對應的測試用例來發現這些缺陷。例如:數組越界和變量未初始化是新手編碼是容易犯的錯誤,先給出如下一段子程序:
1:int getCount(int*p,int n)/*返回數組p中n個元素的累加值 */
2:{
3:int sum; /* 定義整型循環變量 */
4:for(int i=0;i<=n;i++) /* 循環條件 */
5:{
6: sum+=p[i]; /* 不斷累加 */
7:}
8:return sum;
9:}
在這個短短的9行程序中,隱藏了兩個Bug(第3行sum未初始化,第4行i=n時數組訪問越界)。在課堂上,首先讓學生閱讀這段程序,啟發學生通過靜態分析代碼來發現程序中的Bug,這相當于代碼評審的過程,即靜態測試的過程,這個過程也是軟件質量保證一個重要的環節。然后老師和學生一起分析,如何設計測試用例才可以發現這些Bug,并進一步分析和總結設計測試用例的一般方法和理論。最后,老師和學生再一起反思,通過什么措施可以避免重復犯這類錯誤,從而引出編程規范、代碼Lint檢查等相關知識,本例中,第3行的Bug實際上違反了“禁止使用未經初始化的變量”的編程規范;第4行的Bug也可以通過PC-Lint工具檢查發現。
軟件代碼評審是一種靜態白盒測試方法,按照V字形模型,這個質量保證活動發生在代碼編寫完成之后,單元測試之前,是一種高效的缺陷預防方法。在教學過程中,也穿插的介紹代碼評審的組織流程和規范,逐步讓學生認識到軟件開發是有組織、有規范的團隊活動,而不僅僅是個人活動。
通過這種教學方式,學生認識到了軟件測試“從哪里來,到哪里去”。“從哪里來”首先回答了為什么要進行軟件測試,也明白了軟件缺陷的來源:編程技能、個人疏忽、交流不暢、配置管理等。“到那里去”回答了軟件測試的目的,即提高軟件的質量。軟件工程課程中的各種軟件過程和管理措施,設計模式中的各種架構模式都是圍繞這一目標進行的,這樣將軟件測試課程放在整個軟件生命周期中結合其他課程的內容學習,使得學生對高質量軟件開發有了全面的認識,將學生學習到的零散的課程知識轉化為高質量軟件開發的技能。
通過典型缺陷的學習,學生對測試的重要性有了直觀和深刻的認識,從而愿意積極主動地學習軟件測試的相關理論和方法。同時,學生的編程規范水平、編程技能也得到了提高,并且在以后編寫程序的時候,有了缺陷預防的意識,更能滿足實際生產環境軟件質量的要求。
在學習過程中,學生不僅學習了測試用例設計的相關內容,還學習了代碼評審、測試用例評審的、缺陷總結的規范,使學生認識到軟件開發不僅是個人活動,更是一項團隊活動。通過這些活動也訓練了學生團隊協作的能力,有利于學生在實習階段更好地融入職場。
軟件測試是一門綜合性很強的課程,軟件測試的最終目的是提高軟件質量。在教學過程中,結合典型缺陷案例分析,按照代碼評審、測試用例設計和缺陷分析和預防的流程剖析各個案例,使學生加深了對軟件測試的理論和方法的理解,并進一步將軟件工程、設計模式和程序設計等課程的相關內容融會貫通,為今后從事高質量的實際項目開發奠定堅實的基礎。
[1] 李靜,趙志升.軟件測試專業課程體系建設和教學改革[J].教育與職業,2014(2):135-137.
[2] 周元哲.“軟件測試”教學改革的探索和實踐[J].計算機教育,2008(22):14-15.
[3] 劉新浙,劉玲,王超,等.從缺陷中學習C/C++[M].北京:人民郵電出版社,2013:1-2.
[4] Andrew Koenig.C Traps and Pitfalls[M].Addison-Wesley Professional.1989.
[5] Andrew Koenig.Ruminations on C++:A Decade of Programming Insight and Experience[M].Addison-Wesley Professional,1996.
[6] Bruce Eckel.Thinking in Java (4th Edition)[M].Prentice Hall,2006.