天天看點

淺談Junit4和TestNG中的參數化測試

最近在看Junit4的相關知識,由于本身做的是自動化方面的測試,是以工作上着重于應用TestNG。恰好遇到了一個将case進行參數化的需求,故在此記錄Junit4和TestNG在參數化方面的差別。

一、Junit4和TestNG的注釋支援

特點 JUnit 4 TestNG
測試注釋 @Test @Test
在套件中的所有測試運作之前運作 - @BeforeSuite
在套件中的所有測試運作之後運作 - @AfterSuite
測試之前運作 - @BeforeTest
測試之後運作 - @AfterTest
在調用屬于任何這些組的第一個測試方法之前運作 - @BeforeGroups
在調用屬于任何這些組的第一個測試方法之後運作 - @AfterGroups
在調用目前類的第一個測試方法之前運作 @BeforeClass @BeforeClass
在調用目前類的第一個測試方法之後運作 @AfterClass @AfterClass
在每個測試方法之前運作 @Before @BeforeMethod
在每個測試方法之後運作 @After @AfterMethod
忽略測試 @ignore @Test(enbale=false)
預期的異常 @Test(expected = ArithmeticException.class) @Test(expectedExceptions = ArithmeticException.class)
逾時測試 @Test(timeout = 1000) @Test(timeout = 1000)

二、Junit4和TestNG的參數化支援

下面我們來針對最簡單的電腦加法類進行測試。

Calculator.class

package jqi.testng.methods;

/**
 * Just create a tiny class Calculator
 */
public class Calculator
{
    public Calculator(){}
    
    public int add(int firstNumber, int secondNumber){
        return firstNumber + secondNumber;
    }
    
    
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}      

Junit4 中的實作

1 package jqi.testng.testcases;
 2 
 3 import java.util.Arrays;
 4 import java.util.Collection;
 5 
 6 import org.junit.BeforeClass;
 7 import org.junit.Test;
 8 import org.junit.runner.RunWith;
 9 import org.junit.runners.Parameterized; 
10 import org.junit.runners.Parameterized.Parameters;
11 import org.junit.Assert;
12 
13 import jqi.testng.methods.Calculator;
14 
15 @RunWith(Parameterized.class)
16 public class CalculatorJunit4Test {
17     
18      private int firstNumber;  
19      private int secondNumber; 
20      private int sum;
21      public static Calculator calculator;
22      
23      public CalculatorJunit4Test(int firstNumber, int secondNumber, int sum){
24          super();
25          this.firstNumber = firstNumber;  
26          this.secondNumber = secondNumber; 
27          this.sum = sum; 
28      }
29      
30      @BeforeClass
31      public static void setUp(){
32          calculator = new Calculator();
33      }
34      
35     /**
36      * 這裡的傳回的應該是一個可疊代數組,且方法必須是public static
37      * @return
38      */
39     @Parameters
40     public static Collection<Object[]> getParams(){
41 
42          Object[][] data = new Object[][] {{12,9,21},{45,44,89},{18,9,27}};  
43              return Arrays.asList(data);  
44     }
45     
46     @Test
47     public void a_addTest() {
48         Assert.assertTrue(calculator.add(firstNumber, secondNumber) == sum);
49     }
50 }      

Junit4 test case

junit4對于參數化的支援有很多限制,必須将參數傳遞給初始化函數後才能夠應用,而且參數的傳回類型必須是 "List [ ]",是以資料已被限制為String或用于測試的原始類型值

TestNG 中的實作

package jqi.testng.testcases;

import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import jqi.testng.methods.Calculator;

/**
 * Unit test for Calculator.
 */
public class CalculatorTestNGTest 
{
    public Calculator calculator;
    
    @BeforeTest
    public void setUp(){
        calculator = new Calculator();
    }
    /**
     * @return {{firstNumber, secondNumber, sum}, ...}
     * */
    @DataProvider(name="calculatorDataProvider")
    public Object[][] getData() {
        return new Object[][]{{12,9,21},{45,44,89},{18,9,27}};
    }
    
    
    @Test(dataProvider="calculatorDataProvider")
    public void a_addTest(int firstNumber, int secondNumber, int sum){
        Assert.assertTrue(calculator.add(firstNumber, secondNumber) == sum);
    }
}      

TestNG test case

TestNG存在兩種參數化方式,其中一種是利用XML的配置檔案,這裡略過這種方式,可以看到,TestNG的參數化測試非常使用者友好和靈活(在XML檔案或類内)。 它可以支援許多複雜的資料類型作為參數值