Java單元測試和JUnit
**********************單元測試和JUnit********************************
為什麼要使用單元測試
1.底層程式碼沒問題,上一層才不會出現問題.. 就像蓋樓一樣
2.提高士氣,明確知道我的東西是沒問題的, 保證你不被開
3.加大測試的力度可以降低後期維護的成本
一.什麼是JUnit
JUnit是一個單元測試框架,另一個叫做TestNG
框架: 一組類(普通類、抽象類、介面)的集合,別人幫你寫好了,你直接拿來用就可以了,
提供一系列功能... 提供了測試相關的功能
半成品: 一半已經完成了、一半沒有完成
類似於填空題、選擇題
使用框架的好處: 限制了程式設計師的隨意發揮,提高了程式的可讀性和可維護性,便於團隊的開發
JUnit已經逐漸成為xUnit家族中最為成功的一個.
xUnit中還有: cppUnit、pythonUnit、xUnit.net
二.why 為什麼用JUnit
使用main方法測試好不好??
不好.缺點如下
1.多個測試用例類無法同時測,每測一個業務邏輯類 都用單獨去執行它的測試用例,比較麻煩
2.使用main方法測試需要人為的觀察 測試結果 比如看到30 就是正確 比較麻煩
使用了jUnit以後 只需要看bar就可以了 綠條 表示測試通過 紅條 表示測試失敗
三.how 如何使用jUnit
去官網下載 http://junit.org/
最新版本jUnit5 ,我們使用的是穩定版本 jUnit-4.10
下載下來以後是一個zip包,解壓縮 使用裡面的 junit-4.10.jar 檔案即可
1. 導jar包
把junit-4.10.jar 導到 myeclipse中的 build-path中
工程右鍵-build path -configure build path--libraies--add external jar
選中d:\ jUnit-4.10.jar 即可
jar包; 實質就是壓縮包, zip、rar、jar
什麼是build-path?build-path的作用?
build- path 構建路徑
build-path相當於以前所學的class-path的概念,build-path是myeclipse自己
的一套classpath.
程式設計師知道jar包在d:\盤 ,但是myeclipse不知道,如何讓myeclipse找到jar包
把jar新增到build-path中就可以了,myeclipse就能找到jar包了
如果程式設計師沒有使用任何IDE程式設計, 例如使用editplus 這樣想使用jar包需要把
jar包的路徑新增到classpath中即可
Classpath: 執行的類去哪找 是去Classpath找,編譯的時候 當前類 依賴的類(TestCase) 去哪找 也是去Classpath下找
如果沒有把 jUnit-4.10.jar加到 classpath是找不到這個類的...
2. 進行測試
(1) 業務邏輯類 Calculator
(2) 編寫測試用例類
TestXXX
TestCalculator
*************************************使用jUnit如何編寫測試用例類*******************************
1. jUnit3
演示程式碼:
package com.chapter17;
import junit.framework.TestCase;
//測試用例類
//jUnit3的測試用例類
public class TestCalculator extends TestCase {
// 測試方法的命名規範
// public void textXXX 沒有任何的引數
public void testAdd() {
Calculator cal = new Calculator();
int sum = cal.add(10, 20);
//使用斷言來代替 System.out.println
//斷言: 就是判斷的意思
assertEquals("親,失敗了",30,sum);
}
}
如何執行:
展開Outline概要檢視 在你想要執行的測試方法上面 右鍵 run as -junit test
2. jUnit4
測試用例類不需要繼承任何類,直接在測試方法上面加一個@Test註解就可以了
演示程式碼:
import org.junit.Test;
import static org.junit.Assert.*;
//jUnit4的測試用例類
public class TestCalculator4 {
@Test
public void testAdd(){
Calculator cal = new Calculator();
int sum = cal.add(10, 20);
assertEquals("親,失敗了",30,sum);
}
}
**********************************測試結果分析****************************************
1. 測試通過 Pass
期望值和實際值相等,表示測試通過...綠條
一組測試用例
輸入引數1 輸入引數2 期望值 實際值
10 20 30 30
2. 測試失敗 Failure
期望值和實際值不等,紅條
3. 測試錯誤 Error
測試程式碼本身出現問題... 需要先把測試程式碼的錯誤修正以後 再從新進行測試
*************************************測試常用的方法*******************************
jUnit3
setUp(): 在每個測試方法執行前執行,一般用來放建立資源的程式碼(例如連線資料庫、建立socket連線等)
tearDown(): 在每個測試方法執行後執行,一般用來放釋放資源的程式碼(例如關閉資料庫、關閉socket連線等)
jUnit4
Unit4支援多種註解來簡化測試類的編寫
–@Before 註解:與junit3.x中的setUp()方法功能一樣,在每個測試方法之前執行。
–@After 註解:與junit3.x中的tearDown()方法功能一樣,在每個測試方法之後執行。
–@BeforeClass 註解:在所有方法執行之前執行。
–@AfterClass 註解:在所有方法執行之後執行。
–@Test註解:表示當前方法為需要測試的方法。
–@Ignore:臨時禁止一個測試的方法是通過註釋掉它或者改變命名約定,這樣測試執行機就無法找到它。
**測試期望出現一個異常
@Test(expected=ArithmeticException.class)
public void testDivide(){
Calculator cal = new Calculator();
int result = cal.divide(10, 2);
}
**測試效率
新建一個業務邏輯類
public class FileCopy {
public void copy(){
for(int i=1;i<=1000;i++){
System.out.println(i);
}
}
}
測試用例類
public class TestFileCopy {
@Test(timeout=50)
public void testCopy(){
FileCopy fc = new FileCopy();
fc.copy();
}
}
*************************************測試套件*******************************
如果想執行多個測試用類,之前需要在每個測試用例類 上面 單擊右鍵 一個一個執行,比較麻煩.
有沒有一種方式可以讓多個測試用例類 同時執行?
有的.可以把多個測試用例類加入到測試套件中,只需要執行該測試套件即可..執行了這個測試套件,相當於
把該測試套件中所有的測試用例類都挨個執行了
*************************************引數化測試*******************************
讓多組測試用例的資料同時執行
演示程式碼參見教案