網頁

2018/3/4

JUnit 參數化測試(Parameterized Test)

在JUnit 4可使用參數化測試(Parameterized Test),也就是一個測試方法可重複測試多筆參數。

透過Parameterized Test Runner及@Parameter方法來注入要測試的多筆參數。

下面的Calculator.addInteger(int x, int y)為要被測試的方法。

public class Calculator {
  
  public int addInteger(int x, int y) {
    return x + y;
  }
}

ParameterizedTest為參數化測試類別,也就是JUnit中的Runner,用來設定要測試的多筆參數並進行測試。

import static org.junit.Assert.*;

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

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(value=Parameterized.class)
public class ParameterizedTest {
  
  private int expected; // 預期的結果
  private int x;        // 參數1
  private int y;        // 參數2
  
  /* 用來測試的多筆參數設定在這個方法
   * 此方法必須為static方法, 且回傳型態為Collection
   * Collection中的type為陣列, 陣列的長度必須與ParameterizedTest的建構式相同
   * 因為加了@Paramters, 所以在執行測試時JUnit會先呼叫此方法並loop陣列中的參數, 並依序建立ParameterizedTest的實例來測試
   */
  @Parameters
  public static Collection getTestParameters() {
    return Arrays.asList(new Integer[][] {
      {2, 1, 1},
      {3, 2, 1},
      {4, 3, 1}
    });
  }
  
  // ParameterizedTest的建構式
  public ParameterizedTest(int exptected, int x, int y) {
    this.expected = exptected;
    this.x = x;
    this.y = y;
  }
  
  @Test
  public void testAddInteger() {
    Calculator cal = new Calculator();
    assertEquals(expected, cal.addInteger(x, y));
  }

}

參數化測試類別的撰寫方式如下

  • 參數化測試類別名稱加上@RunWith annotation,值為Parameterized.class
  • 新增成員變數,用來作為被測試方法的傳入參數及預期結果。本範例為expectedxy
  • 新增一個無參數的public static Collection方法,該方法前加上@Parameters。本範例為getTestParameters()。此方法在JUnit執行測試前會被先呼叫並loop裡面的參數陣列來建構每一次參數化測試類別(即ParameterizedTest)的實例。方法的回傳值為一個由多筆參數構成的陣列,每一個陣列長度必須與參數化測試類別的建構式相同。
  • 新增一個參數化測試類別的建構式(Constructor),建構式的參數分派至成員變數。此建構式的傳入值來自於@Parameters方法(即getTestParameters())。
  • 新增一個@Test測試方法(即testAddInteger()),用來呼叫被測試的方法。

因為範例中設定三組參數陣列,所以ParameterizedTest一共會被實例化三次並分別執行testAddInteger()

如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。


參考:

沒有留言:

張貼留言