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

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

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