文章目錄:
- 什么是單元測試
- Junit單元測試的優勢
- 如何使用Junit
- Junit編碼規范
1. 什么是單元測試
“單元測試是測試程序構件(例如,方法或對象類)的過程。各個函數或方法是構件的最簡單形式。測試應當用不同的輸入參數來調用這些程序。”
以上是《軟件工程》一書對此的描述。用自己的話來說,就是對程序模塊(軟件設計的最小單位)進行測試,檢查模塊的功能與穩定性。在軟件開發的過程中,每當我們實現了某一個模塊,就需要測試其是否正常和達到預期,只有在確保每個模塊都正常工作的前提下,才能保證整個軟件系統的平穩運行。
2. Junit單元測試的優勢
如果沒有junit,我們是怎么測試軟件的?下面舉一個例子。
我們先隨便編寫了一個計算器類,包含加法和減法兩個方法。
public class Calculator {
//加法
public int add(int a,int b){
return a+b;
}
//減法
public int subtract(int a,int b){
return a-b;
}
}
然后編寫測試類測試這兩個方法。
首先需要創建對象,然后調用這兩個方法,查看輸出的結果,發現答案正確。之后再去編寫其他模塊。
package com.teachertom.calculator;
public class TestCalculator {
public static void main(String[] args) {
Calculator calculator=new Calculator();
System.out.println(calculator.add(5,5));//正確答案10
System.out.println(calculator.subtract(10,5));//正確答案5
}
}
這樣的方法很不方便,需要手動地對比測試數據,而且當測試量非常大時,我們不可能同時在一個測試類中測試,還需要將部分代碼注釋;
同時,很多情況下各種數據相互關聯,修改一個數據可能影響到其他的數據,極大地增加了測試的工作量,拖慢了工作進度。
於是,我們引入了Junit單元測試。
3. 如何使用Junit
首先,我們需要創建一個與當前包同級的包,命名為xxx.xxx.xxx.test
然后在此包下創建測試類,類名:被測試的類Test
定義我們需要測試的方法,方法名:test測試的方法名,返回類型一般為void,不含參數
隨后在方法體上加上@Test,並導入Junit包org.junit.Test.
代碼如下:
package com.teachertom.test;
import org.junit.Test;
public class CalculatorTest {
@Test
public void testAdd(){
}
@Test
public void testSubtract(){
}
}
這樣每個測試方法都可以單獨運行了。以idea為示例,效果應是這樣的。

點擊方法左邊單個三角運行單個方法,點擊類名旁的雙三角運行所有方法。如果測試方法體中產生了異常就會報錯並提示你發生錯誤的方法。如圖發生了算術異常:

下面介紹如何使用Junit判別測試結果。
使用Assert類的靜態方法,assertEquals(),包含兩個參數,左邊是預期值,右邊是實際值。當預期值與實際值不同時便會報錯。
package com.teachertom.test;
import com.teachertom.calculator.Calculator;
import org.junit.Assert;
import org.junit.Test;
public class CalculatorTest {
@Test
public void testAdd(){
Calculator calculator=new Calculator();
Assert.assertEquals(10,calculator.add(5,5));
}
@Test
public void testSubtract(){
Calculator calculator=new Calculator();
Assert.assertEquals(5,calculator.subtract(10,5));
}
}
點擊運行,實際值與預期值相符,測試通過。

如果不相符,則會出現下列字樣。

除此之外,Assert還有一個方法assertArrayEquals(),可以用來測試數組,用法與assertEquals()相同。
@Before與@After注解
在上述的操作中存在一些重復的操作,比如每個方法中都要創建對象。對此,我們可以使用@Before注解來預加載一些內容。
在最后需要關閉和銷毀資源的時候,也可以使用@After注解。
@Before和@After注解在程序報錯的時候,仍然可以保證數據的初始化和關閉銷毀,兩個方法是依舊執行的。
package com.teachertom.test;
import com.teachertom.calculator.Calculator;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class CalculatorTest {
private Calculator calculator;
@Before
public void init(){
calculator=new Calculator();
}
@Test
public void testAdd(){
Assert.assertEquals(10,calculator.add(5,5));
}
@Test
public void testSubtract(){
Assert.assertEquals(5,calculator.subtract(10,5));
}
@After
public void close(){
System.out.println("關閉資源");
}
}
4.Junit編碼規范
在使用Junit的過程中,最好遵循以下規范
類名: 被測試類名Test 例如:CalculatorTest
包名: xxx.xxx.xxx.test例如:com.teachertom.test;
方法名: test測試方法 例如:testAdd
返回值: void
參數列表: 空
*不要忘記添加@Test注解和導入Junit包
