Fork me on GitHub

JUnit与TestNG的区别

1.对于注解类的支持

功能 JUnit TestNG
标注为类/方法为测试类和方法 @Test @Test
标注为在suite中所有测试之前运行 @BeforeSuite
标注为在suite中所有测试之后运行 @AfterSuite
标注为在测试之前运行 @BeforeTest
标注为在测试之后运行 @AfterTest
标注为在测试Group中第一个测试方法之前运行 @BeforeGroups
标注为在测试Group中最后一个测试方法之后运行 @AfterGroups
标注为当前测试类中第一个测试方法之前运行 @BeforeClass @BeforeClass
标注为当前测试类中最后一个测试方法之后运行 @AfterClass @AfterClass
标注为在每次测试方法之前运行 @Before @BeforeMethod
标注为在每次测试方法之后运行 @After @AfterMethod
忽略某测试,让其不执行 @Ignore @Test(enable=false)
期待测试抛出什么异常 @Test(expected=XXXException.class) @Test(exceptedExceptions=XXXException.class)
测试超时,如果测试的执行时间超过了毫秒为单位设置的时间,那么就停止测试并且标记为失败 @Test(timeout=1000) @Test(timeout=1000)

 2.测试参数化

对于TestNG和JUnit都有不同的参数化设定功能,可是表现形式不同。参数化设定意味着当运行测试的时候,参数可以从外部传入到这个测试单元中
对于TestNG来说,要2部分,一是当构造测试代码时候,要用@Parameters(value=XXX)来表示这个测试需要什么参数,这样的优点是可以让测试更加灵活并且可以根据不同的参数来得到不同的期望结果,比如:

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

然后,在我们的XML文件中,我们把参数的具体值设置进来

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
  <test name="testing"> 
    <parameter name="number" value="2"/>                                                                          
    <classes>
       <class name="com.fsecure.demo.testng.TestNGTest6_0" />
    </classes>
  </test>
</suite>

如果我们要给的参数比较复杂,我们无法用一个简单的String或者 原子类型在XML文件”推“给测试方法,那么怎么办呢?这时候,我们就要用”拉“模型了,我们用一个DataProvider属性来给被测试的方法上声明 它需要的数据,然后平行的,用@DataProvider注解来标注一个方法,让这个方法的返回值返回具体的数据,这样我们2个拼接下就完美了。比如说:下面代码声明我们的测试类需要一个DataProvider

@Test(dataProvider = "Data-Provider-Function")
   public void parameterIntTest(TestNGTest6_3_0 clzz) {
      System.out.println("Parameterized Number is : " + clzz.getMsg());
      System.out.println("Parameterized Number is : " + clzz.getNumber());
   }

然后相应的我们用@DataProvider来标注一个方法,这个方法提供了数据

    //This function will provide the patameter data
    @DataProvider(name = "Data-Provider-Function")
    public Object[][] parameterIntTestProvider() {                                                       
        TestNGTest obj = new TestNGTest();
        obj.setMsg("Hello");
        obj.setNumber(123);                                                      
        return new Object[][]{
                   {obj}
        };
    }

3.测试依赖性

对于JUnit 来说,所有的测试彼此之间都是独立的,毫无依赖性。
但是对于 TestNG来说,我们完全可以让测试彼此之间有依赖性,做法就是dependsOnMethods属性来标识一个被依赖的测试方法

@Test
   public void method1() {
      System.out.println("This is method 1");
   }
   @Test(dependsOnMethods={"method1"})
   public void method2() {
       System.out.println("This is method 2");
   }
posted @ 2014-05-10 22:28  花儿笑弯了腰  阅读(1037)  评论(0编辑  收藏  举报