junit4对比testng

概述

以最新版的junit和testng进行一些横向对比总结。两种框架在功能上非常相似且使用范围都很广泛,哪一个更好?

功能比较

注解 异常测试 跳过测试 超时测试 套件 分组 参数化单值 参数化对象 依赖测试
testNG Y Y Y Y Y Y Y Y Y
junit4 Y Y Y Y Y N Y N N

注解支持

描述 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)

JUnit 4中,必须声明“@BeforeClass”和“@AfterClass”方法作为静态方法,TestNG没有这个约束

简单示例

TestNG独特的“分组”概念,每种方法都可以与一个组合相结合,可以根据功能对测试进行分类(分组)

public class TestNGTestGroups{
	@Test(groups="method1")
	public void testingMethod1() {
	  System.out.println("Method - testingMethod1()");
	}
	
	@Test(groups="method2")
	public void testingMethod2() {
	    System.out.println("Method - testingMethod2()");
	}
	
	@Test(groups="method1")
	public void testingMethod1_1() {
	    System.out.println("Method - testingMethod1_1()");
	}
}

使用以下XML文件,可以仅使用组“method1”执行单元测试


  
      
      
        
      
    
    
       
    
  

参数化测试是指参数值的变化。JUnit4 “@RunWith”和“@Parameter”用于提供单元测试的参数值,@Parameters必须返回List [],参数将作为参数传入类构造函数。

@RunWith(value = Parameterized.class)
public class JunitTest{

     private int number;

     public JunitTest(int number) {
        this.number = number;
     }

     @Parameters
     public static Collection data() {
       Object[][] data = new Object[][] { { 1 }, { 2 }, { 3 }, { 4 } };
       return Arrays.asList(data);
     }

     @Test
     public void pushTest() {
       System.out.println("Parameterized Number is : " + number);
     }
}

testNG实现:

public class TestNGTestParameter {

@Test
@Parameters(value="number")
public void parameterIntTest(int number) {
       System.out.println("Parameterized Number is : " + number);
    }
}

XML文件的内容如下


  
    
    
       
    
  

参数为复杂的类型,TestNG使用@DataProvider注解来处理这种情况

@Test(dataProvider = "Data-Provider-Function")
    public void parameterIntTest(Class clzz, String[] number) {
       System.out.println("Parameterized Number is : " + number[0]);
       System.out.println("Parameterized Number is : " + number[1]);
    }

    //This function will provide the patameter data
    @DataProvider(name = "Data-Provider-Function")
    public Object[][] parameterIntTestProvider() {
        return new Object[][]{
                   {Vector.class, new String[] {"java.util.AbstractList",
"java.util.AbstractCollection"}},
                   {String.class, new String[] {"1", "2"}},
                   {Integer.class, new String[] {"1", "2"}}
                  };
    }

依赖性测试表示方法是依赖性测试,它将在所需方法之前执行。 如果依赖方法失败,则所有后续测试将会被跳过,不会被标记为失败。JUnit 4JUnit框架着重于测试隔离; 目前它不支持此功能。TestNG它使用“dependOnMethods”来实现依赖测试

@Test
public void method1() {
   System.out.println("This is method 1");
}

@Test(dependsOnMethods={"method1"})
public void method2() {
    System.out.println("This is method 2");
}

“method2()”只有在“method1()”运行成功的情况下才会执行,否则“method2()”将跳过测试

咳咳~ 基本就这些,根据自己的需求选择一个合适的框架吧~

你可能感兴趣的:(自动化测试,testng,java,junit)