Spring Boot(十二)單元測試JUnit

一槽惫、介紹

JUnit是一款優(yōu)秀的開源Java單元測試框架饮睬,也是目前使用率最高最流行的測試框架现恼,開發(fā)工具Eclipse和IDEA對JUnit都有很好的支持凛澎,JUnit主要用于白盒測試和回歸測試量九。

  • 白盒測試:把測試對象看作一個打開的盒子适掰,程序內(nèi)部的邏輯結(jié)構(gòu)和其他信息對測試人
    員是公開的;

  • 回歸測試:軟件或環(huán)境修復(fù)或更正后的再測試荠列;

  • 單元測試:最小粒度的測試类浪,以測試某個功能或代碼塊。一般由程序員來做肌似,因為它需要知道內(nèi)部程序設(shè)計和編碼的細(xì)節(jié)费就;

JUnit GitHub地址:https://github.com/junit-team

二、JUnit使用

開發(fā)環(huán)境:

  • Spring Boot 2.0.4 RELEASE
  • JUnit 4.12
  • Maven
  • IDEA 2018.2

2.1 檢測JUnit依賴

如果是Spring Boot項目默認(rèn)已經(jīng)加入了JUnit框架支持川队,可在pom.xml中查看:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

如果Maven項目中沒有添加JUnit依賴力细,可參照如上代碼,手動添加固额。

2.2 基礎(chǔ)使用

簡單的測試代碼如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SimpleTest {
    @Test
    public void doTest() {
        int num = new Integer(1);
        Assert.assertEquals(num, 1);
    }
}

在測試類中郵件運(yùn)行項目眠蚂,效果如下:

從控制臺可以看出測試通過了。

2.3 注解說明

2.3.1 注解列表

  • @RunWith:標(biāo)識為JUnit的運(yùn)行環(huán)境对雪;
  • @SpringBootTest:獲取啟動類河狐、加載配置,確定裝載Spring Boot;
  • @Test:聲明需要測試的方法馋艺;
  • @BeforeClass:針對所有測試栅干,只執(zhí)行一次,且必須為static void捐祠;
  • @AfterClass:針對所有測試碱鳞,只執(zhí)行一次,且必須為static void踱蛀;
  • @Before:每個測試方法前都會執(zhí)行的方法窿给;
  • @After:每個測試方法前都會執(zhí)行的方法;
  • @Ignore:忽略方法率拒;

2.3.2 超時測試

代碼如下崩泡,給Test設(shè)置timeout屬性即可,時間單位為毫秒:

@Test(timeout = 1000)

2.4 斷言測試

斷言測試也就是期望值測試猬膨,是單元測試的核心也就是決定測試結(jié)果的表達(dá)式角撞,Assert對象中的斷言方法:

  • Assert.assertEquals 對比兩個值相等
  • Assert.assertNotEquals 對比兩個值不相等
  • Assert.assertSame 對比兩個對象的引用相等
  • Assert.assertArrayEquals 對比兩個數(shù)組相等
  • Assert.assertTrue 驗證返回是否為真
  • Assert.assertFlase 驗證返回是否為假
  • Assert.assertNull 驗證null
  • Assert.assertNotNull 驗證非null

代碼示例如下:

@Test
public void doTest() {
    String[] string1 = {"1", "2"};
    String[] string2 = string1;
    String[] string3 = {"1", "2"};

    Assert.assertEquals(string1, string2);
    Assert.assertEquals(string2, string3);
    Assert.assertSame(string1, string2);
    Assert.assertSame(string2, string3); //驗證不通過,string2勃痴、string3指向的引用不同
}

2.5 Web模擬測試

在Spring Boot項目里面可以直接使用JUnit對web項目進(jìn)行測試谒所,Spring 提供了“TestRestTemplate”對象,使用這個對象可以很方便的進(jìn)行模擬請求沛申。

Web測試只需要進(jìn)行兩步操作:

  1. 在@SpringBootTest注解上設(shè)置“ebEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT”隨機(jī)端口劣领;
  2. 使用TestRestTemplate進(jìn)行post或get請求;

示例代碼如下:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerTest {
    @Autowired
    private TestRestTemplate restTemplate;
    @Test
    public void getName() {
        String name = restTemplate.getForObject("/name", String.class);
        System.out.println(name);
        Assert.assertEquals("Adam", name);
    }
}

其中g(shù)etForObject的含義代表執(zhí)行g(shù)et請求铁材,并返回Object結(jié)果尖淘,第二個參數(shù)設(shè)置返回結(jié)果為String類型,更多的請求方法:

  • getForEntity:Get請求著觉,返回實體對象(可以是集合)德澈;
  • postForEntity:Post請求,返回實體對象(可以是集合)固惯;
  • postForObject:Post請求梆造,返回對象;

2.6 數(shù)據(jù)庫測試

在測試數(shù)據(jù)操作的時候葬毫,我們不想讓測試污染數(shù)據(jù)庫镇辉,也是可以實現(xiàn)的,只需要添加給測試類上添加“@Transactional”即可贴捡,這樣既可以測試數(shù)據(jù)操作方法忽肛,又不會污染數(shù)據(jù)庫了。

示例代碼如下:

@Test
@Transactional
public void saveTest() {
    User user = new User();
    user.setName("Adam");
    user.setAge(19);
    user.setPwd("123456");
    userRepository.save(user);
    System.out.println("userId:" + user.getId());
    Assert.assertTrue(user.getId()>0);
}

執(zhí)行效果如下:

我們可以看到Id有了烂斋,也測試通過了屹逛,說明數(shù)據(jù)是添加是正常的础废,但查看數(shù)據(jù)庫發(fā)現(xiàn)數(shù)據(jù)里面是沒有這條數(shù)據(jù)的。

如果把“@Transactional”去掉的話罕模,數(shù)據(jù)庫就會正常插入了评腺。

2.7 Idea快速開啟測試

在Idea里面可以快速的添加測試的方法,只需要在要測試的類里面右鍵選擇“GoTo”點(diǎn)擊“Test”淑掌,選擇你需要測試的代碼蒿讥,點(diǎn)擊生成即可,如果是Windows 用戶可以使用默認(rèn)快捷鍵“Ctrl + Shift + T”抛腕,效果如下圖:

選完方法之后芋绸,點(diǎn)擊OK按鈕,就生成了對應(yīng)的測試代碼担敌,用戶只需要完善框架里面的具體測試邏輯就可以了摔敛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市全封,隨后出現(xiàn)的幾起案子舷夺,更是在濱河造成了極大的恐慌,老刑警劉巖售貌,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疫萤,居然都是意外死亡颂跨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門扯饶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恒削,“玉大人,你說我怎么就攤上這事尾序〉龇幔” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵每币,是天一觀的道長携丁。 經(jīng)常有香客問我,道長兰怠,這世上最難降的妖魔是什么梦鉴? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮揭保,結(jié)果婚禮上肥橙,老公的妹妹穿的比我還像新娘。我一直安慰自己秸侣,他們只是感情好存筏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布宠互。 她就那樣靜靜地躺著,像睡著了一般椭坚。 火紅的嫁衣襯著肌膚如雪予跌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天藕溅,我揣著相機(jī)與錄音匕得,去河邊找鬼。 笑死巾表,一個胖子當(dāng)著我的面吹牛汁掠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播集币,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼考阱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鞠苟?” 一聲冷哼從身側(cè)響起乞榨,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎当娱,沒想到半個月后吃既,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跨细,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年鹦倚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀惭。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡震叙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出散休,到底是詐尸還是另有隱情媒楼,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布戚丸,位于F島的核電站划址,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏限府。R本人自食惡果不足惜猴鲫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谣殊。 院中可真熱鬧拂共,春花似錦、人聲如沸姻几。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抚恒,卻和暖如春咱台,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俭驮。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工回溺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人混萝。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓遗遵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逸嘀。 傳聞我的和親對象是個殘疾皇子车要,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容