簡(jiǎn)介
相信大部分新手在測(cè)試程序的時(shí)候都喜歡在方法中使用System.out.println()
方法直接把結(jié)果打印出來(lái)眨攘,看結(jié)果是否符合預(yù)期。這種方法在測(cè)試代碼量很小入挣、邏輯簡(jiǎn)單的程序時(shí)很方便亿乳。但日常工作中的項(xiàng)目中的代碼量大、邏輯復(fù)雜径筏,如果還是在方法中使用System.out.println()
來(lái)測(cè)試葛假,只是輸出結(jié)果就令人眼花繚亂。這時(shí)候我們就希望有一個(gè)工具是我們更加方便的在復(fù)雜的項(xiàng)目中進(jìn)行測(cè)試匠璧。JUnit就是這樣一個(gè)工具桐款。
JUnit是一個(gè)Java語(yǔ)言的單元測(cè)試框架。它不僅可以根據(jù)測(cè)試數(shù)據(jù)來(lái)驗(yàn)證程序的正確性夷恍,還將測(cè)試代碼與工程代碼分離魔眨,此外它還可以進(jìn)行批量測(cè)試程序,極大的方便了測(cè)試工作酿雪。JUnit的使用很簡(jiǎn)單遏暴,只需要在方法上加上@Test
注解,JUint就可以識(shí)別到這個(gè)測(cè)試方法指黎。
例子
下面是一個(gè)使用JUint小栗子朋凉。在這個(gè)例子中,我們創(chuàng)建了一個(gè)Calculator
類(lèi)和一個(gè)CalculatorTest
類(lèi)醋安。Calculator
類(lèi)中實(shí)現(xiàn)了兩個(gè)簡(jiǎn)單的方法:add()
和sub()
杂彭,其中add()
方法的邏輯是正確的,其返回值是兩個(gè)參數(shù)之和吓揪;sub()
方法的邏輯是錯(cuò)誤的亲怠,返回值是也是兩個(gè)參數(shù)之和。CalculatorTest
類(lèi)也有兩個(gè)方法:addTest()
和subTest()
柠辞。其中addTest()
用來(lái)測(cè)試Calculator類(lèi)中的add方法团秽,subTest()
方法用來(lái)測(cè)試Calculator
類(lèi)中的sub()
方法。
Step.1 在IDEA中創(chuàng)建一個(gè)Maven工程
Step.2 在pom.xml文件中添加JUnit的依賴(lài)叭首,這樣我們就可以使用JUint啦习勤。這里使用最新版的JUnit。
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.5.0-M1</version>
<scope>test</scope>
</dependency>
Step.3 編寫(xiě)Calculator
類(lèi)焙格。
package com.junit;
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int sub(int a, int b) {
return a + b;
}
}
Step.4 編寫(xiě)CalculatorTest
測(cè)試類(lèi)图毕。
我們將使用CalculatorTest
類(lèi)測(cè)試Calculator
類(lèi)的正確性。CalculatorTest
類(lèi)中有兩個(gè)方法:addTest()
和subTest()
眷唉,它們都需要使用@Test
解來(lái)注明這是一個(gè)測(cè)試方法吴旋。這兩個(gè)方法的邏輯大致相同损肛,都是先創(chuàng)建一個(gè)Calculator
類(lèi)的對(duì)象,調(diào)用各自要測(cè)試的方法荣瑟,最后使用Assertions.assertEquals()
來(lái)讓JUnit判斷程序是否正確治拿。Assertions
是JUnit提供的用來(lái)驗(yàn)證程序運(yùn)行結(jié)果的類(lèi),這里我們使用的Assertions.assertEquals()
方法有兩個(gè)參數(shù)笆焰,第一個(gè)參數(shù)是預(yù)期值劫谅,第二個(gè)參數(shù)是程序的運(yùn)行結(jié)果,調(diào)用Assertions.assertEquals()
方法就可以讓JUnit比較預(yù)期值和程序運(yùn)行結(jié)果嚷掠,以驗(yàn)證程序的正確性捏检。Assertions
中提供了很多Assertions.assertEquals()
方法的重載方法來(lái)比較不同類(lèi)型的數(shù)據(jù),以便于使用不皆。
package com.junit;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class CalculatorTest {
@Test
public void addTest() {
System.out.println("execute addTest");
Calculator calculator = new Calculator();
int result = calculator.add(1, 3);
Assertions.assertEquals(4, result);
}
@Test
public void subTest() {
System.out.println("execute subTest");
Calculator calculator = new Calculator();
int result = calculator.add(1, 3);
Assertions.assertEquals(2, result);
}
}
Step.5 測(cè)試結(jié)果
CalculatorTest類(lèi)在IDEA的顯示如下圖所示贯城,我們可以點(diǎn)擊方法左邊的按鈕運(yùn)行單個(gè)測(cè)試方法,也可以點(diǎn)擊類(lèi)名左邊的按鈕運(yùn)行測(cè)試類(lèi)中的所有測(cè)試方法霹娄。
我們先試下點(diǎn)擊方法左邊的按鈕運(yùn)行進(jìn)行測(cè)試能犯。因?yàn)?code>Caluculator類(lèi)中的
add()
方法邏輯是正確的所以測(cè)試結(jié)果是正確的,在IDEA中的運(yùn)行結(jié)果如下圖所示犬耻。從上圖中我們可以很直觀的看到踩晶,當(dāng)測(cè)試通過(guò)的時(shí)候IDEA的運(yùn)行結(jié)果欄會(huì)有綠色的對(duì)號(hào)。那么當(dāng)測(cè)試不通過(guò)過(guò)的時(shí)候會(huì)怎樣呢枕磁?接下來(lái)渡蜻,我們類(lèi)名左邊的按鈕運(yùn)行測(cè)試類(lèi)中的所有測(cè)試方法。
從上圖中可以看出兩個(gè)測(cè)試方法都被調(diào)用了计济。由于
Calculator
類(lèi)中的sub()
方法的邏輯是錯(cuò)誤的茸苇,所以不會(huì)通過(guò)測(cè)試。從上圖也可以看出IDEA在輸出欄中報(bào)錯(cuò)了沦寂,并打印出期望值是2学密,實(shí)際運(yùn)行結(jié)果是4的錯(cuò)誤。
@BeforeAll @AfterAll @BeforeEach @AfterEach
注解的使用
有些時(shí)候我們需要在測(cè)試方法之前和之后做一些工作凑队,例如打開(kāi)和釋放資源则果。JUnit提供了一組注解來(lái)幫助我們實(shí)現(xiàn)這類(lèi)操作幔翰。
@BeforeAll
注解的方法會(huì)在測(cè)試類(lèi)的所有測(cè)試方法(包括被@BeforeEach
注解的方法)執(zhí)行之前執(zhí)行漩氨。使用@BeforeAll
注釋的方法必須為static
方法
@AfterAll
會(huì)在測(cè)試類(lèi)的所有測(cè)試方法(包括被@BeforeEach
注解的方法)執(zhí)行之前執(zhí)行。使用@AfterAll
注釋的方法必須為static
方法
@BeforeEach
會(huì)在測(cè)試類(lèi)的所有測(cè)試方法(除了被@BeforeAll
注解的方法)執(zhí)行之前執(zhí)行遗增。
@AfterEach
會(huì)在測(cè)試類(lèi)的所有測(cè)試方法(除了被@AfterAll
注解的方法)執(zhí)行之后執(zhí)行叫惊。
為了進(jìn)一步了解這幾個(gè)注解的使用,我們?cè)?code>CalculatorTest類(lèi)中添加這幾個(gè)注解做修。
package com.junit;
import org.junit.jupiter.api.*;
public class CalculatorTest {
@BeforeAll
public static void beforeAll() {
System.out.println("beforeAll");
}
@BeforeEach
public void beforeEach() {
System.out.println("beforeEach");
}
@AfterAll
public static void afterAll() {
System.out.println("afterAll");
}
@AfterEach
public void afterEach() {
System.out.println("afterEach");
}
@Test
public void addTest() {
System.out.println("execute addTest");
Calculator calculator = new Calculator();
int result = calculator.add(1, 3);
Assertions.assertEquals(4, result);
}
@Test
public void subTest() {
System.out.println("execute subTest");
Calculator calculator = new Calculator();
int result = calculator.add(1, 3);
Assertions.assertEquals(2, result);
}
}
運(yùn)行結(jié)果如下圖所示
從運(yùn)行結(jié)果中可以看出霍狰,使用
@BeforeAll
注解的方法在所有測(cè)試方法被執(zhí)行之前執(zhí)行抡草,使用@AfterAll
注解的方法在所有測(cè)試方法被執(zhí)行之后執(zhí)行,它們都只被執(zhí)行了一次蔗坯。使用@BeforeEach
在測(cè)試類(lèi)的除了被@BeforeAll
注解的方法的所有測(cè)試方法執(zhí)行之前被執(zhí)行康震。使用@AfterEach
會(huì)在測(cè)試類(lèi)的除了被@AfterAll
注解的方法所有測(cè)試方法執(zhí)行之后執(zhí)行,它們都被執(zhí)行了兩次宾濒。
JUnit使用入門(mén)的介紹到此結(jié)束腿短,對(duì)JUnit有興趣的同學(xué)可以進(jìn)行更深入的學(xué)習(xí)。