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