网上看了一篇英文帖子,讲解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)来表示这个测试需要什么参数,这样的优点是可以让测试更加灵活并且可以根据不同的参数来得到不同的期望结果,比如:
1
2
3
4
5
6
7
8
9
|
public
class
TestNGTest6_1_0 {
@Test
@Parameters
(value=
"number"
)
public
void
parameterIntTest(
int
number) {
System.out.println(
"Parameterized Number is : "
+ number);
}
}
|
然后,在我们的XML文件中,我们把参数的具体值设置进来,如下:
1
2
3
4
5
6
7
8
9
10
11
|
<!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:
1
2
3
4
5
|
@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来标注一个方法,这个方法提供了数据:
1
2
3
4
5
6
7
8
9
10
11
12
|
//This function will provide the patameter data
@DataProvider
(name =
"Data-Provider-Function"
)
public
Object[][] parameterIntTestProvider() {
TestNGTest6_3_0 obj =
new
TestNGTest6_3_0();
obj.setMsg(
"Hello"
);
obj.setNumber(
123
);
return
new
Object[][]{
{obj}
};
}
|
3.测试依赖性:
对于JUnit 来说,所有的测试彼此之间都是独立的,毫无依赖性。
但是对于 TestNG来说,我们完全可以让测试彼此之间有依赖性,做法就是dependsOnMethods属性来标识一个被依赖的测试方法:
1
2
3
4
5
6
7
8
|
@Test
public
void
method1() {
System.out.println(
"This is method 1"
);
}
@Test
(dependsOnMethods={
"method1"
})
public
void
method2() {
System.out.println(
"This is method 2"
);
}
|
本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1217389,如需转载请自行联系原作者