最近在看Junit4的相关知识,由于本身做的是自动化方面的测试,所以工作上着重于应用TestNG。恰好遇到了一个将case进行参数化的需求,故在此记录Junit4和TestNG在参数化方面的区别。

一、Junit4和TestNG的注释支持

 

特点JUnit 4TestNG
测试注释 @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文件或类内)。 它可以支持许多复杂的数据类型作为参数值

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!