前言
這幾天正在成都出差,欣賞著成都的妹紙。
當(dāng)我開始寫這篇的時(shí)候是上周五馋记,沒想到這么快就星期二了,東西越寫越多懊烤,為了保持文章盡量短小精悍梯醒,Juint的詳細(xì)用法就分成多篇來寫把,具體能寫幾篇我也不清楚...
正文
現(xiàn)在我們看是介紹Junit的用法奸晴,如果你想看看官方的介紹冤馏,可以訪問http://junit.org/junit4/。
Assertions(斷言)
斷言我們之前已經(jīng)在demo中使用過了寄啼,他的作用就是明確我們期望發(fā)生的情況逮光,如果不滿足就會(huì)報(bào)錯(cuò)代箭,就是一種突然成為上帝的感覺,不符合條件的情況我們就不允許發(fā)生涕刚。
Junit中斷言有好幾種嗡综,從字面我們就可以知道他們的用途,例如
assertArrayEquals:斷言兩個(gè)數(shù)組是否相等
assertEquals:斷言字符串是否相等
assertTrue:斷言判斷為true
assertNotNull:斷言不為空
assertSame:斷言相同
他們還有相反的斷言杜漠,例如assertEquals极景,對(duì)應(yīng)就有assertNotEquals,這里就不全都列舉出來了驾茴。
斷言最多有三個(gè)參數(shù):
String reason: 描述要測(cè)試的原因盼樟,此參數(shù)可以省略
T actual:要判斷的參數(shù)
T matcher:對(duì)比的參數(shù)
其中稍微復(fù)雜一點(diǎn)的assertThat,他相當(dāng)于上面列舉的斷言的升級(jí)版锈至,他更加靈活晨缴,接下來我們舉一個(gè)例子:
int x = 3;
assertThat("assertThat good", "good", is("good"));
assertEquals("assertEquals good", "good", "good");
assertThat(x, is(3));
上面的代碼中,我們通過assertThat峡捡,assertEquals都去判斷同一個(gè)字符串是否相等击碗,第三個(gè)斷言是判斷整型是否相等。
運(yùn)行之后沒有報(bào)錯(cuò)们拙,說明assertThat稍途,assertEquals都測(cè)試通過了,這兩種用法得到的結(jié)果是相同的砚婆。
assertThat只能判斷相同類型械拍,例如要判斷的參數(shù)為int型,對(duì)比的參數(shù)也只能是int型装盯。對(duì)比的參數(shù)要使用Matcher參數(shù)殊者,類似于一個(gè)判斷語句,比如的有:
is():相當(dāng)于 “是” 的意思
not():相當(dāng)于 “不是的意思”
ok验夯,以上就是斷言的用法,通常我們沒有必要使用assertThat摔刁,其他的斷言幾乎可以滿足我們所有的需求挥转,但是我們?nèi)匀灰斡浰挠梅ā?/p>
Test Runners
我沒想到一個(gè)特別合適的詞來形容Test Runners的作用,所以多說幾句:
Test Runners 是具有特殊功能的執(zhí)行測(cè)試用例的通道共屈,也可以理解為測(cè)試的執(zhí)行者绑谣,例如可以同時(shí)運(yùn)行多個(gè)測(cè)試用例,也可以具有這個(gè)測(cè)試執(zhí)行者特有的功能拗引。
用法1
/**
* Test Runner 示例代碼
*/
public class TestRunnerDemo {
@Test
public void runnerTest(){
org.junit.runner.JUnitCore.runClasses(ExampleUnitTest.class, StudentTest.class);
}
}
我們可以通過org.junit.runner.JUnitCore.runClasses()方法來同時(shí)運(yùn)行多個(gè)測(cè)試class文件借宵,里面的參數(shù)個(gè)數(shù)是隨意的,例如示例代碼中按照順序運(yùn)行了ExampleUnitTest.class和StudentTest.class矾削。
用法2
/**
* Test Runner 實(shí)例代碼2
*/
@RunWith(Suite.class)
// 綁定的測(cè)試用例集合
@Suite.SuiteClasses({ExampleUnitTest.class, StudentTest.class})
public class TestRunnerDemo2 {
}
通過注解@RunWith與其他測(cè)試用例進(jìn)行綁定壤玫,然后@Suite.SuiteClasses({ExampleUnitTest.class, StudentTest.class})來設(shè)置綁定的測(cè)試用例的集合豁护,當(dāng)運(yùn)行這個(gè)測(cè)試用例的時(shí)候,綁定的集合也會(huì)運(yùn)行欲间。
用法3
package com.lzp.unittestdemo.testrunner;
import com.lzp.unittestdemo.Utils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.Arrays;
import java.util.Collection;
/**
* <p>
* Test Runner 示例代碼3
*/
@RunWith(Parameterized.class)
public class TestRunnerDemo3 {
/**
* name可以用來描述這個(gè)測(cè)試的信息
* 其中{index}表示當(dāng)前的索引值楚里,因?yàn)閳?zhí)行的時(shí)候會(huì)遍歷集合
* {0} 表示參數(shù)鍵值對(duì)的第一個(gè)位置
* {1} 表示參數(shù)鍵值對(duì)的第二個(gè)位置,坐標(biāo)以此類推
*/
@Parameters()
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{0, 0}, {1, 1}, {2, 1}, {3, 2}, {4, 3}, {5, 5}, {6, 8}
});
}
private int fInput;
private int fExpected;
/**
* 這里模擬了創(chuàng)建對(duì)象的過程猎贴,Juit會(huì)自動(dòng)把@Parameters里面的數(shù)據(jù)集合班缎,按照順序依次放入構(gòu)造方法中
* */
public TestRunnerDemo3(int input, int expected) {
fInput = input;
fExpected = expected;
System.out.println(input + " :" + expected);
}
/**
* 測(cè)試方法,通過Assert.assertEquals判斷參數(shù)是否符合我們的期望
* */
@Test
public void test() {
Assert.assertEquals(fExpected, Utils.compute(fInput));
}
}
使用@RunWith(Parameterized.class)會(huì)稍微復(fù)雜一點(diǎn)她渴,但是使用起來非常的方便达址,我們可以創(chuàng)建很多個(gè)相同類型的對(duì)象,然后通過測(cè)試方法對(duì)屬性進(jìn)行操作趁耗,驗(yàn)證我們創(chuàng)建的類是否符合我們的期望沉唠。
用法4
@RunWith(Categories.class)
// 為這個(gè)測(cè)試添加分類
@Category(MyCategory.class)
// 綁定的測(cè)試類集合
@Suite.SuiteClasses( { TestRunnerDemo.class, TestRunnerDemo3.class })
// 交集,運(yùn)行SuiteClasses中與自己分類相同的測(cè)試類
//@Categories.IncludeCategory(MyCategory.class)
// 除去交集对粪,運(yùn)行SuiteClasses中與自己分類不同的測(cè)試類
@Categories.ExcludeCategory(MyCategory.class)
public class TestRunnerDemo4 {
@Test
public void test(){
assertEquals(4, 2 + 2);
}
}
使用@Category可以對(duì)測(cè)試類添加分類右冻,然后和@Suit結(jié)合使用,可以同時(shí)運(yùn)行相同分類或不同分類的測(cè)試著拭,算是上一種用法的升級(jí)版纱扭。
用法5
有時(shí)候我們會(huì)把測(cè)試方法卸載內(nèi)部類中,這個(gè)時(shí)候我們需要使用@RunWith(Enclosed.class)儡遮,這樣可以運(yùn)行內(nèi)部類的測(cè)試方法乳蛾, 這里貼出官方的demo連接:https://github.com/junit-team/junit4/wiki/%27Enclosed%27-test-runner-example,大家可以學(xué)習(xí)一下鄙币。
用法6
使用第三方的Test Runner:
這是官網(wǎng)的舉例肃叶,之后我們會(huì)用到MockitoJUnitRunner,其他的大家可以自己去百度學(xué)習(xí)一下如何使用十嘿。
Test execution order(測(cè)試運(yùn)行順序)
有時(shí)候我們需要一些測(cè)試按照我們期望的順序進(jìn)行因惭,例如對(duì)同一個(gè)屬性按照某個(gè)順序多次加工,我們想要看到最終的結(jié)果绩衷,這種情況下蹦魔,我們可以使用@FixMethodOrder()。
@FixMethodOrder() 指明類中測(cè)試方法的運(yùn)行順序咳燕。
MethodSorters.DEFAULT:不可預(yù)測(cè)的順序勿决,可以認(rèn)為是隨機(jī)的順序。
MethodSorters.JVM:按照J(rèn)VM編譯的順序招盲,順序也可能發(fā)生變化
MethodSorters.NAME_ASCENDING:按照方法的命名的順序低缩,也就是按照字母的順序,從a到z曹货。
@FixMethodOrder(MethodSorters.DEFAULT)
public class TestMethodOrder {
@Test
public void testA() {
System.out.println("first");
}
@Test
public void testC() {
System.out.println("third");
}
@Test
public void testB() {
System.out.println("second");
}
}
上面是官方的demo咆繁,為了讓測(cè)試結(jié)果更明顯讳推,我把testC()移動(dòng)到了第一位,看一下運(yùn)行結(jié)果:
從截圖上看么介,確實(shí)是按照A娜遵、B、C的順序執(zhí)行壤短。
總結(jié)
今天就到此為止设拟,東西不難,但是知識(shí)點(diǎn)還是挺多的久脯,都需要我們慢慢消化纳胧,我也是用的時(shí)候,偶爾還得復(fù)習(xí)一遍帘撰。
聽同事說今天立冬跑慕,啥也別說了,先填飽我的肚子把摧找,各位拜拜~