Android Junit Test

Table of Contents

 

簡介

JUnit-Test API簡介

JUnit - 測試套件

JUnit - 忽略測試

JUnit - 時間測試

JUnit - 異常測試

JUnit - 參數化測試


簡介

本文講解Android Junit Test 的使用

在項目目錄下的build.gradle文件的dependencies中添加

testImplementation 'junit:junit:4.12'

 

JUnit-Test API簡介

常用api

 

1

void assertEquals(boolean expected, boolean actual)

檢查兩個變量或者等式是否平衡

2

void assertTrue(boolean expected, boolean actual)

檢查條件爲真

3

void assertFalse(boolean condition)

檢查條件爲假

4

void assertNotNull(Object object)

檢查對象不爲空

5

void assertNull(Object object)

檢查對象爲空

6

void assertSame(boolean condition)

assertSame() 方法檢查兩個相關對象是否指向同一個對象

7

void assertNotSame(boolean condition)

assertNotSame() 方法檢查兩個相關對象是否不指向同一個對象

8

void assertArrayEquals(expectedArray, resultArray)

assertArrayEquals() 方法檢查兩個數組是否相等

 

JUnit 中的註釋的列表以及他們的含義:

1

@Test

這個註釋說明依附在 JUnit 的 public void 方法可以作爲一個測試案例。

2

@Before

有些測試在運行前需要創造幾個相似的對象。在 public void 方法加該註釋是因爲該方法需要在 test 方法前運行。

3

@After

如果你將外部資源在 Before 方法中分配,那麼你需要在測試運行後釋放他們。在 public void 方法加該註釋是因爲該方法需要在 test 方法後運行。

4

@BeforeClass

在 public void 方法加該註釋是因爲該方法需要在類中所有方法前運行。

5

@AfterClass

它將會使方法在所有測試結束後執行。這個可以用來進行清理活動。

6

@Ignore

這個註釋是用來忽略有關不需要執行的測試的。

JUnite 執行過程:

  • beforeClass() 方法首先執行,並且只執行一次。

  • afterClass() 方法最後執行,並且只執行一次。

  • before() 方法針對每一個測試用例執行,但是是在執行測試用例之前。

  • after() 方法針對每一個測試用例執行,但是是在執行測試用例之後。

  • 在 before() 方法和 after() 方法之間,執行每一個測試用例。

JUnit - 測試套件

測試套件意味着捆綁幾個單元測試用例並且一起執行他們。在 JUnit 中,@RunWith 和 @Suite 註釋用來運行套件測試。這個教程將向您展示一個例子,其中含有兩個測試樣例 TestJunit1 & TestJunit2 類,我們將使用測試套件一起運行他們。

使用 Test Suite 類

  • 創建一個 java 類。

  • 在類中附上 @RunWith(Suite.class) 註釋。

  • 使用 @Suite.SuiteClasses 註釋給 JUnit 測試類加上引用。

 


import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
   TestJunit1.class,
   TestJunit2.class
})
public class JunitTestSuite {   
}  

 

JUnit - 忽略測試

有時可能會發生我們的代碼還沒有準備好的情況,這時測試用例去測試這個方法或代碼的時候會造成失敗。@Ignore 註釋會在這種情況時幫助我們。

  • 一個含有 @Ignore 註釋的測試方法將不會被執行。

  • 如果一個測試類有 @Ignore 註釋,則它的測試方法將不會執行。

現在我們用例子來學習 @Ignore。

 

 

import org.junit.Ignore;
import static org.junit.Assert.assertEquals;

public class TestJunit {

   String message = "Robert";   
   MessageUtil messageUtil = new MessageUtil(message);

   @Ignore
   @Test
   public void testPrintMessage() {
      System.out.println("Inside testPrintMessage()");
      message = "Robert";
      assertEquals(message,messageUtil.printMessage());
   }

   @Test
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Robert";
      assertEquals(message,messageUtil.salutationMessage());
   }
}

TestJunit 在類級別上使用 @Ignore 來忽略所有的測試用例

import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;

@Ignore
public class TestJunit {

   String message = "Robert";   
   MessageUtil messageUtil = new MessageUtil(message);

   @Test
   public void testPrintMessage() {
      System.out.println("Inside testPrintMessage()");
      message = "Robert";
      assertEquals(message,messageUtil.printMessage());
   }

   @Test
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Robert";
      assertEquals(message,messageUtil.salutationMessage());
   }
}

 

JUnit - 時間測試

Junit 提供了一個方便選項。如果一個測試用例比起指定的毫秒數花費了更多的時間,那麼 Junit 將自動將它標記爲失敗。timeout 參數和 @Test 註釋一起使用。現在讓我們看看代碼中 @test(timeout)。

import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;

public class TestJunit {

   String message = "Robert";   
   MessageUtil messageUtil = new MessageUtil(message);

   @Test(timeout=1000)
   public void testPrintMessage() { 
      System.out.println("Inside testPrintMessage()");     
      messageUtil.printMessage();     
   }

   @Test
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Robert";
      assertEquals(message,messageUtil.salutationMessage());
   }
}

 

JUnit - 異常測試

Junit 用代碼處理提供了一個追蹤異常的選項。你可以測試代碼是否它拋出了想要得到的異常。expected 參數和 @Test 註釋一起使用。現在讓我們看看活動中的 @Test(expected)。

import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;

public class TestJunit {

   String message = "Robert";   
   MessageUtil messageUtil = new MessageUtil(message);

   @Test(expected = ArithmeticException.class)
   public void testPrintMessage() { 
      System.out.println("Inside testPrintMessage()");     
      messageUtil.printMessage();     
   }

   @Test
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Robert";
      assertEquals(message,messageUtil.salutationMessage());
   }
}

 

JUnit - 參數化測試

Junit 4 引入了一個新的功能參數化測試。參數化測試允許開發人員使用不同的值反覆運行同一個測試。你將遵循 5 個步驟來創建參數化測試。

  • 用 @RunWith(Parameterized.class) 來註釋 test 類。

  • 創建一個由 @Parameters 註釋的公共的靜態方法,它返回一個對象的集合(數組)來作爲測試數據集合。

  • 創建一個公共的構造函數,它接受和一行測試數據相等同的東西。

  • 爲每一列測試數據創建一個實例變量。

  • 用實例變量作爲測試數據的來源來創建你的測試用例。

一旦每一行數據出現測試用例將被調用。讓我們看看活動中的參數化測試。

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.Before;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals;

@RunWith(Parameterized.class)
public class PrimeNumberCheckerTest {
   private Integer inputNumber;
   private Boolean expectedResult;
   private PrimeNumberChecker primeNumberChecker;

   @Before
   public void initialize() {
      primeNumberChecker = new PrimeNumberChecker();
   }

   // Each parameter should be placed as an argument here
   // Every time runner triggers, it will pass the arguments
   // from parameters we defined in primeNumbers() method
   public PrimeNumberCheckerTest(Integer inputNumber, 
      Boolean expectedResult) {
      this.inputNumber = inputNumber;
      this.expectedResult = expectedResult;
   }

   @Parameterized.Parameters
   public static Collection primeNumbers() {
      return Arrays.asList(new Object[][] {
         { 2, true },
         { 6, false },
         { 19, true },
         { 22, false },
         { 23, true }
      });
   }

   // This test will run 4 times since we have 5 parameters defined@Testpublic void testPrimeNumberChecker() {
      System.out.println("Parameterized Number is : " + inputNumber);
      assertEquals(expectedResult, 
      primeNumberChecker.validate(inputNumber));
   }
}

一旦它會將所有的數組中的參數全部運行,Object[][] 每一行代表一組數據,一組中第一個代表參數第二個代表預期結果。

運行測試

./gradlew --info test clean 

或可以點擊類中兩個運行按鈕

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章