最近在看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对于参数化的支持有很多限制,必须将参数传递给初始化函数后才能够应用,而且参数的返回类型必须是 "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存在两种参数化方式,其中一种是利用XML的配置文件,这里略过这种方式,可以看到,TestNG的参数化测试非常用户友好和灵活(在XML文件或类内)。 它可以支持许多复杂的数据类型作为参数值