目? 錄
一、實驗學時
二、實驗目的
三、實驗環境
(一)硬件環境:
(二)軟件環境:
四、實驗內容
1、實驗方案:
2、實驗步驟:
3、設計思路:
1、安裝JUnit和Eclemma
2、編寫函數
3、設計測試用例
4、編寫JUnit測試
5、運行測試并分析結果
6、使用Eclemma進行代碼覆蓋率分析
7、審查和修訂
五、實驗結果
1、安裝JUnit和Eclemma
(1)JUnit單元測試框架安裝
(2)Eclemma代碼覆蓋率工具安裝
2、利用Eclipse編寫函數
3、測試用例編寫
(1)正向測試用例
(2)反向測試用例
4、利用JUnit進行測試
5、利用Eclemma進行覆蓋率分析
六、實驗小結(包括問題和解決辦法、心得體會、意見與建議等)
1、實驗問題及解決方法:
2、實驗心得體會:
3、實驗意見與建議:
一、實驗學時
????????2學時
二、實驗目的
????????1.系統學習和理解單元測試的基本概念、原理。
????????2.掌握單元測試的基本技術和方法。
????????3.掌握在Eclipse里面進行JUnit單元測試的基本流程與使用方法。
????????4.掌握EclEmma代碼覆蓋測試工具的使用。
????????5.理解JUnit4中幾個注解:@Before、@After、@Test、@Ignore、@BeforeClass、@AfterClass的用法及執行次序。
三、實驗環境
(一)硬件環境:
????????1.筆記本電腦一臺
????????2.內存大小:64G
????????3.磁盤空間:1TB
(二)軟件環境:
????????1.操作系統:Windows(64位)11
????????2.文本撰寫:WPS
????????3.軟件工具:Eclipse、JUnit、Eclemma
四、實驗內容
1、實驗方案:
????????在Eclipse中,安裝JUnit單元測試框架和Eclemma代碼覆蓋率工具,為代碼的全面測試和分析打下基礎。創建一個Java項目并編寫所需類,實現根據年份和月份返回對應天數的方法。運用黑盒測試和白盒測試的原理,設計全面的測試用例,確保所有可能的輸入情況都被覆蓋。利用JUnit編寫測試類,并使用注解和斷言方法進行測試,詳細記錄并分析測試結果。
????????完成測試后,借助Eclemma插件深入分析代碼覆蓋率,查看哪些代碼行被測試覆蓋,哪些未覆蓋,并根據分析結果調整測試用例或代碼,以進一步提高覆蓋率。通過以上步驟,我們將完成函數的編寫、測試及代碼覆蓋率分析,確保代碼的質量和穩定性得到充分的驗證。
2、實驗步驟:
????????(1)在Eclipse中安裝JUnit單元測試框架和Eclemma代碼覆蓋率工具。
????????(2)利用Eclipse編寫函數,根據提供的年份和月份,返回該月的天數。
????????(3)運用黑盒測試方法或白盒測試方法設計該函數的測試用例。
????????(4)利用JUnit完成整個函數的測試過程,并記錄并分析測試結果。
????????(5)使用Eclemma分析單元測試代碼的覆蓋率情況。
????????(6)完成實驗報告的書寫及提交工作。
3、設計思路:
1、安裝JUnit和Eclemma
????????將JUnit和Eclemma集成到Eclipse中,以便進行單元測試和代碼覆蓋率分析。
2、編寫函數
????????在Eclipse中創建一個新的Java項目,編寫一個方法,接收年份和月份作為參數,并返回對應月份的天數。
3、設計測試用例
????????采用黑盒測試或白盒測試中的等價類劃分、邊界值分析、錯誤推測等方法來設計測試用例。
- 通過等價類劃分將輸入字段劃分為有效和無效兩類,然后針對每類設計測試用例。
- 通過邊界值分析測試輸入字段的邊界值。
- 通過錯誤推測預測可能出現的錯誤情況并設計相應的測試用例。
4、編寫JUnit測試
????????在Eclipse中創建一個JUnit測試類,編寫測試方法,針對函數的各種情況編寫測試用例,并使用斷言來驗證函數的行為是否符合預期。
5、運行測試并分析結果
????????在Eclipse中運行JUnit測試,觀察測試結果,檢查測試是否通過,并記錄失敗的測試用例以進行調試和修復。
6、使用Eclemma進行代碼覆蓋率分析
????????使用Eclemma工具分析JUnit測試的代碼覆蓋率,查看代碼覆蓋率報告,確定哪些部分的代碼沒有被測試到,并根據需要更新測試用例以提高代碼覆蓋率。
7、審查和修訂
????????完成測試用例的編寫后,需要進行審查和修訂。包括檢查測試用例的完整性、準確性和可執行性,確保它們能夠全面覆蓋測試目標和范圍。同時,還需要根據實際需求和技術變化對測試用例進行更新和調整。
????????通過以上步驟,可以系統地設計針對所編寫函數的測試用例,以確保測試工作的有效性和高效性。
五、實驗結果
1、安裝JUnit和Eclemma
(1)JUnit單元測試框架安裝
- 打開Eclipse后點擊菜單欄中的File,在下拉菜單中選擇New并點擊,然后點擊出現的Java Project進行Java項目的創建,如圖1-1-1所示:
圖1-1-1?Java項目創建界面1
- 輸入項目名稱為“YLW_JUnit”后點擊Next進入下一步后點擊Finish完成項目的創建,如圖1-1-2所示:
圖1-1-2?Java項目創建界面2
- 使用鼠標右擊剛才創建的項目,然后點擊菜單最下方的“Properties”,如圖1-1-3所示:
圖1-1-3?JUnit單元測試框架安裝界面1
- 在新的窗口中點擊“Java Build Path”后選擇“Libraries”中的“Modulepath”,再點擊“Add Library”進行JUnit單元測試框架的安裝,如圖1-1-4所示:
圖1-1-4?JUnit單元測試框架安裝界面2
- 在“Add Library”窗口中選擇“JUnit”后點擊Next進入下一步后再點擊下拉菜單選擇“JUnit5”后點擊Finish完成JUnit5數據包的載入,如圖1-1-5所示:
圖1-1-5?JUnit單元測試框架添加界面1
- JUnit數據包添加完畢后點擊界面右下角的“Apply”進行應用,或者直接點擊“Apply and Close”應用并關閉,如圖1-1-6所示:
圖1-1-6?JUnit單元測試框架添加界面2
- 當JUnit單元測試框架安裝完畢后,會在對應的庫中存在相關的一系列JAR文件,如圖1-1-7所示:
圖1-1-7?JUnit單元測試框架添加成功界面
(2)Eclemma代碼覆蓋率工具安裝
- 打開Eclipse后點擊菜單欄中的Help,在下拉菜單中點擊Eclipse Marketplace,如圖1-2-1所示:
圖1-2-1?Eclemma代碼覆蓋率工具安裝界面1
- 在彈出的窗口搜索欄輸入“EclEmma”后點擊回車,如圖1-2-2所示:
圖1-2-2?Eclemma代碼覆蓋率工具安裝界面2
- 滑動滾輪找到“EclEmma Java Code Coverage 3.1.8”點擊安裝即可,如圖1-2-3所示:
圖1-2-3?Eclemma代碼覆蓋率工具安裝界面3
2、利用Eclipse編寫函數
????????(1)右擊項目的“Src文件夾”后點擊“New”會出現子目錄,在子目錄中點擊“Class”創建“ReturnDay.java”Java類文件,如圖2-1所示:
圖2-1?Java類文件創建界面1
????????(2)在彈出的窗口中填寫對應的類名后點擊界面右下角的Finish按鈕即可完成對應Java類文件的創建,如圖2-2所示:
圖2-2?Java類文件創建界面2
????????(3)在“ReturnDay.java”類文件中編寫函數,使其可以根據所提供的年份和月份返回對應月份的天數,如圖2-3所示:
圖2-3?Java類文件執行結果界面
????????函數代碼:
import java.util.Scanner;// 返回當月天數的類
public class ReturnDay {// 返回當月天數的方法體(年份,月份)public static int getDaysInMonth(int year, int month) {if (year <= 0 || String.valueOf(year).contains("+")) {System.out.println("年份輸入錯誤,請輸入正確的年份(正整數)!");return 0;}if (month <= 1 || month >= 12) {System.out.println("月份輸入錯誤,請重新輸入正確的月份(1至12月)!");return 0;}// 初始化天數為0int days = 0;// 月份判斷switch (month) {// 1、3、5、7、8、10、12月份為每一年的大月,當月為31天case 1:case 3:case 5:case 7:case 8:case 10:case 12:days = 31;break;// 4、6、9、11月份為每一年的小月,當月為30天case 4:case 6:case 9:case 11:days = 30;break;// 2月閏年29天,平年是28天(4年一閏)case 2:if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {days = 29;} else {days = 28;}break;default:System.out.println("數據信息錯誤,無法返回對應天數!");}return days;}// 主函數public static void main(String[] args) {// 初始化輸入Scanner scanner = new Scanner(System.in);String StringInput = "Y";while (StringInput.equals("Y")) {System.out.print("請輸入所需年份:");while (!scanner.hasNextInt()) {System.out.println("年份輸入錯誤,請輸入正確的年份(非整數)!");scanner.next();}int year = scanner.nextInt();System.out.print("請輸入所需月份:");while (!scanner.hasNextInt()) {System.out.println("月份輸入錯誤,請輸入正確的月份(非整數)!");scanner.next();}int month = scanner.nextInt();if (month < 1 || month > 12) {System.out.println("月份輸入錯誤,請重新輸入正確的月份(1至12月)!");continue;}int days = getDaysInMonth(year, month);System.out.println(year+"年"+month+"月有:"+days+"天");System.out.println("");System.out.println("是否繼續進行輸入? (Y/N): ");StringInput = scanner.next();}scanner.close();}
}
3、測試用例編寫
(1)正向測試用例
????????正向測試用例是用來驗證函數在給定有效輸入時是否產生預期的輸出,測試函數的各種預期用法,并確保函數對于標準輸入提供正確的響應。
表3-1正向測試用例
(2)反向測試用例
????????反向測試用例是用來驗證函數在給定無效輸入或異常情況下的行為是否正確,測試函數對于異常情況的處理方式,包括錯誤檢測和錯誤消息的生成。確保函數在面對非預期輸入時能夠適當地處理,而不會導致系統崩潰或不正確的行為。
表3-2反向測試用例
4、利用JUnit進行測試
????????(1)右擊“ReturnDay.java”類文件后點擊“New”在子菜單中選擇“JUnit Test Case”進行測試用例的創建,如圖4-1所示:
圖4-1?測試用例類文件創建界面1
? ? ? ? (2)在“JUnit Test Case”界面輸入類文件的名稱為“ReturnDayTest”后勾選所需要創建的函數選項并點擊Next進入下一步,如圖4-2所示:
圖4-2?測試用例類文件創建界面2
????????(3)進入新界面后選擇需要進行測試的函數,勾選后點擊Finish按鈕即可完成對應測試類函數的創建工作,如圖4-3所示:
圖4-3?測試用例類文件創建界面3
????????(4)測試用例類文件創建完畢后在類中添加對應的測試用例方法進行函數的覆蓋化測試,如圖4-4所示:
圖4-4?測試用例類文件編寫界面
????????測試用例代碼:
import org.junit.Test;
import static org.junit.Assert.*;public class ReturnDayTest {@Testpublic void test_R1_T() {// 測試閏年的2月份天數int year = 2020;int month = 2;int expectedDays = 29;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}@Testpublic void test_P1_T() {// 測試平年的2月份天數int year = 2021;int month = 2;int expectedDays = 28;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}@Testpublic void test_R2_Min() {// 測試閏年小月的天數int year = 2020;int month = 4;int expectedDays = 30;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}@Testpublic void test_P2_Min() {// 測試平年小月的天數int year = 2021;int month = 4;int expectedDays = 30;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}@Testpublic void test_R3_Max() {// 測試閏年大月的天數int year = 2020;int month = 8;int expectedDays = 31;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}@Testpublic void test_P3_Max() {// 測試平年大月的天數int year = 2021;int month = 8;int expectedDays = 31;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}@Testpublic void test_4_FY() {// 測試非法年份(0)int year = -2021;int month = 4;int expectedDays = 0;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}@Testpublic void test_4_FM() {// 測試非法月份(0)int year = 2020;int month = -4;int expectedDays = 0;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}@Testpublic void test_5_FM() {// 測試非法月份(0)int year = 2021;int month = 0;int expectedDays = 0;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}@Testpublic void test_6_FM() {// 測試非法月份(0)int year = 2020;int month = 13;int expectedDays = 0;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}@Testpublic void test_7_FY() {// 測試非法年份(0)int year = +2021;int month = 4;int expectedDays = 0;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}@Testpublic void test_8_TY() {// 測試特殊年份2月的天數(2000)int year = 2000;int month = 2;int expectedDays = 29;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}@Testpublic void test_9_TY() {// 測試特殊年份2月的天數int year = 1000;int month = 2;int expectedDays = 28;int actualDays = ReturnDay.getDaysInMonth(year, month);assertEquals(expectedDays, actualDays);}
}
? ? ? ? (5)測試用例方法全部添加完畢后可以進行測試用例的運行操作,右擊主界面后點擊“Run As”再選擇“JUnit Test”進行測試用例的運行,如圖4-5所示:
圖4-5?測試用例類文件運行界面
????????(6)測試用例運行完畢后即可查看對應的相關測試用例覆蓋率等數據信息,如圖4-6所示:
圖4-6?測試用例類文件運行結果界面
5、利用Eclemma進行覆蓋率分析
????????(1)點擊界面左上角運行按鈕旁邊的覆蓋運行按鈕即可對覆蓋率進行對應的分析,如圖5-1所示:
圖5-1?測試用例類文件覆蓋率分析運行界面
????????(2)運行后點擊菜單欄中的“Windows”并選擇“Show View”后點擊“Other”進入到對應界面,如圖5-2所示:
圖5-2?測試用例類文件覆蓋率查看過程界面1
????????(3)在新界面的輸入框中輸入“coverage”后回車,選擇出現的“Coverage”文件并點擊窗口右下角的“Open”按鈕進行打開,如圖5-3所示:
圖5-3?測試用例類文件覆蓋率查看過程界面2
????????(4)打開后即可查看到相關的所有覆蓋率詳情信息,如圖5-4所示:
圖5-4?測試用例類文件覆蓋率查看界面
????????(5)覆蓋率分析查看完畢后進行相關的覆蓋率報告的導出工作,點擊菜單欄中的“File”后選擇“Export”進入到對應的界面,如圖5-5所示:
圖5-5?測試用例覆蓋率報告導出界面1
????????(6)進入新界面后點擊“Run/Debug”并選擇“Coverage Session”后點擊Next進入下一步,如圖5-6所示:
圖5-6?測試用例覆蓋率報告導出界面2
????????(7)在新界面中選擇導出方式為“HTML”和導出的位置,點擊Finish后即可完成對應覆蓋率報告的導出工作,如圖5-7所示:
圖5-7?測試用例覆蓋率報告導出界面3
????????(8)在指定的導出位置即可看見導出后的HTML文件,點擊對應的HTML文件就可以看到對應的所有覆蓋率數據信息,如圖5-8所示:
圖5-8-1?測試用例覆蓋率報告界面1
圖5-8-2?測試用例覆蓋率報告界面2
圖5-8-3?測試用例覆蓋率報告界面3
六、實驗小結(包括問題和解決辦法、心得體會、意見與建議等)
1、實驗問題及解決方法:
????????1)實驗問題:對返回當月天數函數的單元測試的需求理解不清楚。
解決方法:仔細分析函數,可以參考其他類似的實現方式,以幫助理解具體的細節。
????????2)實驗問題:單元測試用例書寫不熟練,導致用例撰寫效率低下。
解決方法:了解單元測試的基本步驟和示例,通過實際操作和練習,逐漸提高對單元測試用例撰寫的熟練度。
????????3)實驗問題:在設計單元測試用例時遇到了邊界條件的處理困難。
解決方法:采用邊界值分析和等價類劃分等測試方法,對系統的邊界條件進行明確化,即確定輸入、輸出和操作的邊界值。然后,根據這些邊界值設計相應的單元測試用例,覆蓋各種邊界情況。
????????4)實驗問題:單元測試用例設計過程中遇到了重復勞動和低效率的情況。
解決方法:嘗試利用單元測試用例模板,提前定義好單元測試用例的結構和格式。模板可以包括測試目標、測試步驟、輸入數據、預期結果等內容,以減少重復工作。可以將常見的測試場景和用例模板存儲在團隊的知識庫中,以便團隊成員共享和復用,提高設計效率。也可以嘗試自動化測試工具來輔助單元測試用例設計和生成,以進一步提高效率和準確性。通過團隊內部的交流和協作,可以共同發現和解決單元測試用例設計中的問題,不斷改進和優化測試流程,提高工作效率和質量。
????????5)實驗問題:單元測試用例過于冗長或復雜,不利于理解和執行。
解決方法:對于復雜的測試場景,可以將單元測試用例進行拆分,以簡化測試步驟和降低測試難度。同時,可以使用圖形化工具或流程圖來清晰地展示測試步驟和流程,提高單元測試用例的可讀性和可執行性。
????????6)實驗問題:在設計單元測試用例時遇到了測試數據的獲取困難,無法構造有效的測試場景。
解決方法:通過模擬或虛擬數據生成工具生成測試數據,以滿足單元測試用例的需求,確保測試數據的真實性和有效性。
????????7)實驗問題:在執行單元測試用例時遇到了性能穩定性問題,導致測試結果不準確或不穩定。
解決方法:通過性能測試工具對函數進行性能測試,發現函數的瓶頸和性能問題,并及時采取優化措施。可以對函數進行壓力測試和負載測試,以評估函數在高負載情況下的穩定性和可靠性。
????????8)實驗問題:單元測試用例設計過程中遇到了缺乏實際經驗或領域知識的挑戰,無法充分覆蓋所有可能的測試場景。
解決方法:通過學習和培訓提升自己的測試技能和領域知識,以更好地理解函數的功能和業務流程,并設計出更全面的單元測試用例。同時,可以與團隊成員進行知識共享和經驗交流,共同解決測試設計中的難題。
2、實驗心得體會:
????????(1)在實驗中,我深刻認識到對需求的準確理解是測試工作的基礎。在設計單元測試用例之前,必須對軟件函數的功能需求有清晰的認識,包括各個功能點的具體要求和期望的輸出。為了確保對需求的理解準確,我多次閱讀了需求文檔,并進行了討論和溝通,以澄清任何不清楚的地方。只有確保對需求的準確理解,才能夠設計出充分覆蓋各種情況的單元測試用例,從而提高測試的有效性和全面性。
????????(2)通過此次實驗我學會了不同的單元測試用例設計技巧,如等價類劃分、邊界值分析和錯誤推測等。這些技巧在設計單元測試用例時非常實用,可以幫助我發現潛在的軟件缺陷并提高測試的覆蓋率。例如,在設計邊界值單元測試用例時,我注意到了函數在邊界處的行為是否符合預期,并設計了相應的單元測試用例進行驗證。在設計等價類劃分單元測試用例時,我將輸入數據分成有效類和無效類,并針對每個類別設計了相應的單元測試用例。通過靈活運用不同的單元測試用例設計技巧,我能夠設計出更加全面和有效的單元測試用例,提高測試的質量和效率。
????????(3)實驗不僅是一個學習的過程,也是一個不斷改進的過程。在實驗中,我不僅學到了很多關于軟件測試和質量控制的知識和技能,還不斷地探索新的方法和技巧,以提高測試工作的效率和質量。例如,在設計單元測試用例時,我嘗試了不同的方法和技巧,并根據實際情況進行了調整和改進。通過持續學習和改進,我能夠不斷提高自己的測試技能和水平,不斷優化測試過程,以應對日益復雜的軟件函數和測試需求。
????????(4)在實驗結束后,我對整個實驗過程進行了反思和總結。我回顧了實驗中遇到的問題和解決方案,分析了實驗過程中的不足和改進空間,并提出了相應的改進建議。通過反思和總結,我深刻認識到了自己的不足之處,并下定決心在以后的學習和工作中不斷改進和提高自己。我將繼續保持對新知識和新技能的學習和探索,不斷完善自己的測試技能,為今后的學習和工作打下更加堅實的基礎。
3、實驗意見與建議:
????????(1)增加更多的實際案例和練習機會,可以幫助我們將理論知識與實際應用相結合。通過實際案例的分析和解決,可以加深我們對軟件測試和質量控制的理解,提高實踐能力。這些案例和練習可以包括真實的軟件函數或項目案例,讓我們在實踐中掌握測試方法和技巧,培養解決問題的能力。同時,可以提供實際項目中的測試場景和需求文檔,讓我們從實際項目中學習,提高實驗的實用性和應用性
????????(2)增加對測試工具的培訓和應用,可以幫助我們掌握常用測試工具的基本操作和功能,提高測試工作的效率和質量。同時,也可以增加對開源測試工具的介紹和應用,以提供更多選擇和學習機會。安排專門的課程或實驗環節,介紹常用的測試工具,如禪道、Selenium、JMeter等,并結合實際案例進行演示和操作。同時,可以鼓勵我們在實驗中使用測試工具進行測試任務的完成,提供實際操作的機會,加深對測試工具的理解和應用能力。
????????(3)提供個性化的指導和反饋,可以幫助我們更好地理解和掌握知識,解決遇到的問題。通過及時的指導和反饋,可以幫助我們更快地進步,提高實驗成績和學習效果。安排實驗指導老師或助教進行一對一或小組指導,解答學生的問題,提供學習建議和反饋意見。同時,可以組織學生進行實驗報告的互評和同行評議,促進學生之間的交流和學習,提高實驗報告的質量和水平。
????????(4)鼓勵我們獨立思考和創新實踐,可以激發我們的學習興趣和創造力,培養我們的問題解決能力和創新意識。設置開放性的實驗項目或任務,讓我們自由選擇研究方向和方法,進行探索和實踐。同時,可以提供創新性實驗項目或課程設計,鼓勵學生進行創新性的實驗和項目研究,培養學生的問題解決能力和創新意識。
????????(5)關注實驗設備和環境的改進,提供良好的實驗條件和環境,可以幫助我們更好地進行實驗和學習,提高實驗效果和體驗。通過更新實驗設備,配備最新的軟硬件設備和工具,提高實驗設備的性能和穩定性。同時,可以改善實驗環境,提供舒適的學習環境和便利的實驗條件,為我們的學習和實驗提供良好的支持和保障。