最近在看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檔案或類内)。 它可以支援許多複雜的資料類型作為參數值