您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源單元測(cè)試工具 > junit
JUnit單元測(cè)試框架的使用
作者:java_阿杰 發(fā)布時(shí)間:[ 2016/10/9 14:04:50 ] 推薦標(biāo)簽:單元測(cè)試 Junit

  如果一個(gè)方法被 @Before 修飾過了,那么在每個(gè)測(cè)試方法調(diào)用之前,這個(gè)方法都會(huì)得到調(diào)用。所以上面的例子中, testAdd() 被運(yùn)行之前, setup() 會(huì)被調(diào)用一次,把 mCalculator 實(shí)例化,接著運(yùn)行 testAdd() ; testMultiply() 被運(yùn)行之前, setup() 又會(huì)被調(diào)用一次,把 mCalculator 再次實(shí)例化,接著運(yùn)行 testMultiply() 。如果還有其他的測(cè)試方法,則以此類推。
  對(duì)應(yīng)于 @Before 的,有一個(gè) @After ,作用估計(jì)你也猜得到,那是每個(gè)測(cè)試方法運(yùn)行結(jié)束之后,會(huì)得到運(yùn)行的方法。比如一個(gè)測(cè)試文件操作的類,那么在它的測(cè)試類中,可能 @Before 里面需要去打開一個(gè)文件,而每個(gè)測(cè)試方法運(yùn)行結(jié)束之后,都需要去close這個(gè)文件。這個(gè)時(shí)候可以把文件close的操作放在 @After 里面,讓它自動(dòng)去執(zhí)行。
  類似的,還有 @BeforeClass 和 @AfterClass 。 @BeforeClass 的作用是,在跑一個(gè)測(cè)試類的所有測(cè)試方法之前,會(huì)執(zhí)行一次被 @BeforeClass 修飾的方法,執(zhí)行完所有測(cè)試方法之后,會(huì)執(zhí)行一遍被 @AfterClass 修飾的方法。這兩個(gè)方法可以用來setup和release一些公共的資源,需要注意的是,被這兩個(gè)annotation修飾的方法必須是靜態(tài)的。
  前面講的是單元測(cè)試框架對(duì)于一個(gè)測(cè)試方法的第一步“setup”,為我們做的事情。而對(duì)于第三部“驗(yàn)證結(jié)果”,則一般是通過一些assert方法來完成的。JUnit為我們提供的assert方法,多數(shù)都在 Assert 這個(gè)類里面。常用的那些如下:
  assertEquals(expected, actual)
  驗(yàn)證expected的值跟actual是一樣的,如果是一樣的話,測(cè)試通過,不然的話,測(cè)試失敗。如果傳入的是object,那么這里的對(duì)比用的是equals()
  assertEquals(expected, actual, tolerance)
  這里傳入的expected和actual是float或double類型的,大家知道計(jì)算機(jī)表示浮點(diǎn)型數(shù)據(jù)都有一定的偏差,所以哪怕理論上他們是相等的,但是用計(jì)算機(jī)表示出來則可能不是,所以這里運(yùn)行傳入一個(gè)偏差值。如果兩個(gè)數(shù)的差異在這個(gè)偏差值之內(nèi),則測(cè)試通過,否者測(cè)試失敗。
  assertTrue(boolean condition)
  驗(yàn)證contidion的值是true
  assertFalse(boolean condition)
  驗(yàn)證contidion的值是false
  assertNull(Object obj)
  驗(yàn)證obj的值是null
  assertNotNull(Object obj)
  驗(yàn)證obj的值不是null
  assertSame(expected, actual)
  驗(yàn)證expected和actual是同一個(gè)對(duì)象,即指向同一個(gè)對(duì)象
  assertNotSame(expected, actual)
  驗(yàn)證expected和actual不是同一個(gè)對(duì)象,即指向不同的對(duì)象
  fail()
  讓測(cè)試方法失敗
  注意:上面的每一個(gè)方法,都有一個(gè)重載的方法,可以在前面加一個(gè)String類型的參數(shù),表示如果驗(yàn)證失敗的話,將用這個(gè)字符串作為失敗的結(jié)果報(bào)告。
  比如:
  assertEquals("Current user Id should be 1", 1, currentUser.id());
  當(dāng) currentUser.id() 的值不是1的時(shí)候,在結(jié)果報(bào)道里面將顯示"Current user Id should be 1",這樣可以讓測(cè)試結(jié)果更具有可讀性,更清楚錯(cuò)誤的原因是什么。
  比較有意思的是后一個(gè)方法, fail() ,你或許會(huì)好奇,這個(gè)有什么用呢?其實(shí)這個(gè)在很多情況下還是有用的,比如明顯的一個(gè)作用是,你可以驗(yàn)證你的測(cè)試代碼真的是跑了的。
  此外,它還有另外一個(gè)重要作用,那是驗(yàn)證某個(gè)被測(cè)試的方法會(huì)正確的拋出異常,不過這點(diǎn)可以通過下面講到的方法,更方便的做到,所以不講了。
  這部分相對(duì)來說還是很好理解的,不做過多解釋。
  JUnit的其他功能
  Ignore一些測(cè)試方法
  很多時(shí)候,因?yàn)槟承┰颍ū热缯酱a還沒有實(shí)現(xiàn)等),我們可能想讓JUnit忽略某些方法,讓它在跑所有測(cè)試方法的時(shí)候不要跑這個(gè)測(cè)試方法。要達(dá)到這個(gè)目的也很簡(jiǎn)單,只需要在要被忽略的測(cè)試方法前面加上 @Ignore 可以了,如下:
  public class CalculatorTest {
  Calculator mCalculator;
  @Before
  public void setup() {
  mCalculator = new Calculator();
  }
  // Omit testAdd() and testMultiply() for brevity
  @Test
  @Ignore("not implemented yet")
  public void testFactorial() {
  }
  }
  驗(yàn)證方法會(huì)拋出某些異常
  有的時(shí)候,拋出異常是一個(gè)方法正確工作的一部分。比如一個(gè)除法函數(shù),當(dāng)除數(shù)是0的時(shí)候,它應(yīng)該拋出異常,告訴外界,傳入的被除數(shù)是0,示例代碼如下:
  public class Calculator {
  // Omit testAdd() and testMultiply() for brevity
  public double divide(double divident, double dividor) {
  if (dividor == 0) throw new IllegalArgumentException("Dividor cannot be 0");
  return divident / dividor;
  }}
  那么如何測(cè)試當(dāng)傳入的除數(shù)是0的時(shí)候,這個(gè)方法應(yīng)該拋出 IllegalArgumentException 異常呢?
  在Junit中,可以通過給 @Test annotation傳入一個(gè)expected參數(shù)來達(dá)到這個(gè)目的,如下:
  public class CalculatorTest {
  Calculator mCalculator;
  @Before
  public void setup() {
  mCalculator = new Calculator();
  }
  // Omit testAdd() and testMultiply() for brevity
  @Test(expected = IllegalArgumentException.class)
  public void test() {
  mCalculator.divide(4, 0);
  }
  }
  @Test(expected = IllegalArgumentException.class) 表示驗(yàn)證這個(gè)測(cè)試方法將拋出 IllegalArgumentException 異常,如果沒有拋出的話,則測(cè)試失敗。
  小結(jié)
  這篇文字大概簡(jiǎn)單介紹了JUnit的使用,相對(duì)來說是比較簡(jiǎn)單,也是比較容易理解的,希望能幫助到大家。其中Assert部分,可以幫我們驗(yàn)證一個(gè)方法的返回結(jié)果。然而,這些只能幫我們測(cè)試有返回值的那些方法。在第一篇文章里面我們講了,一個(gè)類的方法分兩種,一是有返回值的方法,這些可以通過我們講的JUnit來做測(cè)試。而另外一種沒有返回值的方法,即void方法,則要通過另外一個(gè)框架,Mockito,來驗(yàn)證它的正確性。

上一頁(yè)12下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd