張?zhí)K 楊元峰 陸公正



摘要:單元測試是軟件測試過程中必不可少的一個環(huán)節(jié)。作為《軟件測試工具應用》課程的一個教學單元,在單元測試教學設計中,分析了單元測試的教學定位、學情和教學目標。結合黑盒測試用例設計方法和白盒測試用例設計方法,通過設計不同的案例,討論了JUnit單元測試、被測代碼100%覆蓋率以及JDBC GUI程序的單元測試的在教學中的實現(xiàn)。
關鍵詞:案例教學;軟件測試;單元測試;JUnit
中圖分類號:G642 文獻標識碼:A
文章編號:1009-3044(2020)13-0132-04
高職教育的培養(yǎng)目標是復合型專業(yè)技術人才,培養(yǎng)學生不僅具有豐富的專業(yè)知識,更要有較強的實踐動手能力、技術創(chuàng)新能力和可持續(xù)發(fā)展的能力。在專業(yè)技能培養(yǎng)方面要和企業(yè)實際工作要求相結合,通過各種實踐教學保障學生獲得充分的專業(yè)知識和專業(yè)技能,能夠順利地適應新工作崗位的要求,具備較高的職業(yè)素養(yǎng)和技術水平。
軟件測試是軟件質量保障的重要手段之一,而單元測試是軟件測試過程中必不可少的一個測試階段。單元測試是對軟件中的最小的可測試單元進行檢查和驗證。單元測試可以由測試工程師來完成也可以由程序開發(fā)工程師來完成。從企業(yè)對人才的要求來看,單元測試技術是學生將來從事不管是開發(fā)還是測試,都必須掌握的基本技術。
執(zhí)行單元測試有助于幫助開發(fā)人員理清業(yè)務邏輯思路,提高代碼質量,降低bug出現(xiàn)率。在開發(fā)端執(zhí)行單元測試,可以減少錯誤反饋時間,提高工作效率。當我們使用單元測試工具來編寫測試代碼時,這些測試代碼將協(xié)同源代碼一起進行保存和維護,當軟件版本升級時,這將大大降低新版本軟件測試的工作量,使得代碼維護更容易并提升代碼質量。
針對不同的類型的軟件應用,可以采用不同的單元測試工具。在教學中我們選用JUnit工具進行教學,幫助學生掌握單元測試的基本思想和基本做法。
1單元測試教學設計
基于JUnit的單元測試教學是本?!盾浖y試工具應用》課程的一個教學單元。該課程依據軟件測試過程,將教學內容分為:需求分解、測試計劃撰寫、測試管理、基于JUnit的單元測試、自動化測試、性能測試、測試報告撰寫等教學單元。課程總課時80課時,課程教學內容設計如圖1所示。
基于JUnit的單元測試屬于《軟件測試工具應用》課程的一個教學單元。在學習本課程前,學生應掌握面向對象JAVA程序開發(fā)的基本思想,會編寫JAVA邏輯代碼,會編寫基于JDBC數據庫訪問的GUI應用程序,并在同步學習JavaWeb開發(fā)課程。通過本單元的學習,希望學生能夠掌握單元測試基本概念,理解單元測試的目的、意義以及工作過程。能夠針對不同類型的被測程序采用合適的黑盒、白盒用例設計方法,通過縝密的邏輯分析來設計測試用例,以達到全面的代碼測試覆蓋率。使用JUnit工具將用例寫成測試代碼,執(zhí)行測試。通過測試代碼預置bug使得學生在單元測試執(zhí)行過程中體會和掌握缺陷報告和缺陷跟蹤管理部分的工作內容。
通過案例教學使得學生能夠熟練掌握使用JUnit進行單元測試,培養(yǎng)學生縝密的邏輯分析和用例設計能力以及細心、耐心的工作態(tài)度。單元測試學情和教學目標分析如圖2所示。
2教學過程設計
基于JUnit的單元測試教學分成4個教學步驟,層層深入,開展教學,具體的教學過程設計方案如表1所示。第一步講解單元測試的概念和基本原理,講解JUnit各語法的作用和使用方法,使得同學們能夠看懂和理解JUnit代碼。
第二步以NextDay程序單元測試為案例,引入算法類程序的單元測試方法。NextDay程序用于返回指定日期的下一個日期。在進行測試用例設計教學時,使用該案例進行基于等價類分析法、邊界值分析法、錯誤推測法的黑盒測試用例設計,以及基于邏輯覆蓋和獨立路徑分析的白盒測試用例設計,在教授單元測試時,指導學生使用JUnit將這些測試用例寫成單元測試代碼。在完成本部分內容授課后,可以給學生提供一些更復雜的應用案例,引導學生理解和學會算法類程序的單元測試,實現(xiàn)分層次教學引導。
第三步以房產信息管理模塊單元測試為案例,講解白盒測試用例設計方法和實現(xiàn),配合EclEmma插件,編寫測試代碼,實現(xiàn)被測代碼100%的測試覆蓋。使得學生在整個測試過程中提高源代碼白盒分析水平,提高自己的測試代碼編寫能力。
第四步以顧客信息管理模塊單元測試為案例,講解分層數據庫應用程序的單元測試方法。該案例是一個java GUI應用程序,采用Mysql數據庫,程序實現(xiàn)了顧客信息的添加、修改、刪除和查詢功能。窗體應用程序的單元測試主要是針對程序dao層的添加、修改、刪除和查詢接口(interface)編寫JUnit單元測試代碼并執(zhí)行測試。
通過以上教學步驟層層遞進,教會同學們從一般算法到窗體應用程序的JUnit單元測試代碼編寫和執(zhí)行。
3NextDay教學案例設計
NextDay程序是測試學習經典程序,該程序實現(xiàn)的功能是用戶輸入一個有效日期,由程序返回該日期的下一天的日期。例如2020/2/28的下一天是2020/2/29。被測程序由6個類組成,分別是:Nextday、CalendarUnit、Day、Month、Date、Year。根據黑盒測試用例設計方法設計測試用例舉例,首先進行等價類分析,劃分出有效等價類和無效等價類,然后根據邊界值分析法確定每個等價類邊界值的內點、上點和離點,將這些分析寫成測試用例,最后再加上閏年、閏月等特殊數據完成用例設計。
測試用例代碼舉例如圖3所示,testNextDay函數中實現(xiàn)了日邊界nextday合法數據的測試代碼,測試了大月、小月和閏月的日期邊界nextDay函數返回值是否正確。testDateValid函數中測試了程序是否對非法的日期進行處理。2個測試函數的執(zhí)行結果如圖4所示。在授課過程中要求同學們把年、月、日的邊界,有效日期和無效日期均編寫相應的測試用例代碼并執(zhí)行。通過該部分的教學引導同學們掌握JUnit單元測試的一般做法,在課外習題中補充難度更大的算法案例,來實現(xiàn)分層教學,鞏固學習成果。
4房產信息管理模塊案例設計
房產信息管理模塊程序使用HashMap來保存房屋數據,實現(xiàn)房產信息的添加、修改、刪除和查詢。教學中要求根據白盒測試用例設計方法設計測試用例,編寫和執(zhí)行JUnit代碼并統(tǒng)計代碼覆蓋率。白盒測試用例設計方法主要有邏輯覆蓋法和獨立路徑分析法。源程序代碼測試覆蓋率統(tǒng)計使用EclEmma插件生成JUnit覆蓋率測試報告來實現(xiàn)。房產信息管理模塊由3個類和1個接口構成,其類圖結構如圖5所示。
在對該模塊進行測試的時候,設計測試用例配合EclEmma插件實現(xiàn)對測試代碼的全覆蓋。如圖6所示為測試用例舉例,該測試用例實現(xiàn)了對新增房產信息、修改房產信息、判斷是否已經存在、根據房產編號查詢房產信息、顯示所有房產信息、根據房產價格查詢房產信息、刪除房產信息等功能的測試。
這是一個測試用例的示范,根據白盒測試方法進一步補充設計用例以達到100%的被測代碼覆蓋率。如圖7所示為源代碼測試覆蓋率截圖。在執(zhí)行測試的時候會碰到一些問題,例如有的代碼難以被覆蓋到,最后發(fā)現(xiàn)該代碼本身邏輯上就有問題,屬于永遠都不會被執(zhí)行到的代碼,那么應該把這些代碼去掉或者重寫。在測試中還有一些異常處理代碼可能較難被測試覆蓋,這時可能做不到100%的代碼覆蓋率,需要根據具體情況進行分析。在執(zhí)行測試的時候,使用EclEmma插件會將沒有被覆蓋到的代碼標紅色顯示,這非常有助于改善和提高測試用例以獲得更好的測試效果。
5顧客信息管理模塊教學案例設計
顧客信息管理模塊是一個Java GUI應用程序,數據存放在Mysql數據庫中,實現(xiàn)客戶信息的添加、修改、刪除和查詢。被測系統(tǒng)程序結構如圖8所示,程序運行界面如圖9所示。該程序由bean、dao、db、gui4個包構成:bean包中存放實體類;dao包中存放客戶類添加、修改、刪除的接口interface和接口實現(xiàn)類;db包中存放JDBC數據庫連接對象;gui包中存放各窗體JFrame代碼。
在教學中,顧客信息管理模塊的JUnit測試主要實現(xiàn)對于顧客信息添加、修改、刪除的Dao層進行的測試,測試思路和執(zhí)行步驟設計如表2所示。首先在JUnit測試代碼中生成Custom-erDAOImp類的對象,調用各個interface實現(xiàn)方法,實現(xiàn)相應功能,然后測試代碼通過jdbc連接,直接去數據庫表查詢相關數據進行比對,來驗證interface的功能有沒有正確實現(xiàn)。表2列舉了各個interface的測試設計。
例如在測試deleteCustomer時,先刪除編號為1的客戶信息,再根據編號1查詢客戶,根據是否能查到來判斷根據編號刪除客戶功能是否正確。在測試getAllCustomer時,先根據CustomerDAO對象獲得所有客戶List的size,再通過JDBC去數據庫中查詢所有客戶數目的總數,比較2個數目是否一致來判斷該功能是否正確。當然客戶數目一致不代表所有數據是一致的,也可以修改代碼為按序查出所有客戶對象后,逐個比較數據內容。
6結語
在教學過程中,根據人才培養(yǎng)目標,分析學生特點,在單元測試教學模塊中以案例教學方法改進教學效果。在學生已具備基本的測試知識后,以3個教學案例覆蓋各知識技能點,使用NextDay教學案例教學教會學生黑盒用例設計和實現(xiàn)方法,學習算法類程序的單元測試方法;使用房產信息管理模塊案例教學教會學生白盒用例設計方法和分析方法,實現(xiàn)被測代碼100%覆蓋率;使用顧客信息管理模塊教學案例教學教會學生分層數據庫應用程序的單元測試方法。三個案例層層深入,涉及知識點和技能點全面,在實際教學中取得了良好的教學效果。