1,如下图,选中想要生成单元测试的类,点击菜单栏Navigate,选择Test,根据提示选择想要生成的相关测试的方法,在对应的Test目录生成测试类。
2,TestNG的简单使用
首先生成的所有测试方法上都有Test注解,你可以在对应的测试方法测试相关的你想要单元测试的方法。
(1)assertEquals的使用
首先导入相关的包
import static org.testng.Assert.assertEquals;
执行之后,如下图,则运行成功,实际得到的与所期望的是一致的
修改对应代码,并运行,如下图
上面的例子只是简单用法,旨在让初学者可以快速上手了解 TestNG 的 用法,下面介绍一些高级用法来帮助我们更好的进行单元测试。
@BeforeClass/@AfterClass
和 @BeforeMethod/@AfterMethod
除了 @Test
注解,TestNG 还有两对常用的注解:@BeforeClass/@AfterClass
和 @BeforeMethod/@AfterMethod
。这些注解的关系如下图:
从上图可以看出,@BeforeMethod/@AfterMethod
是在 @Test
注解函数执行之前/之后执行的钩子函数。在执行每一个 @Test
注解函数执行之前/之后都会执行 @BeforeMethod/@AfterMethod
注解函数。
@BeforeClass/@AfterClass
的作用和 @BeforeMethod/@AfterMethod
类似,不同的是,@BeforeClass/@AfterClass
是在初始化类的时候执行,这就意味着 @BeforeClass/@AfterClass
只会执行一次,而 @BeforeMethod/@AfterMethod
执行次数和 @Test
注解函数个数一样。
public class UtilsMainTest {
@BeforeClass
public void say(){
System.out.println("我是前置类");
}
@Test
public void testAdd() throws Exception {
UtilsMain um = new UtilsMain();
assertEquals(um.add(4,4),8);
}
@Test
public void testDec() throws Exception {
UtilsMain um = new UtilsMain();
assertEquals(3,um.dec(8,5));
}
@BeforeMethod
public void go1(){
System.out.println("我是前置方法");
}
@AfterMethod
public void go2(){
System.out.println("我是后置方法");
}
@AfterClass
public void say2(){
System.out.println("我是后置类");
}
@Test(timeOut = 1)
public void testTime(){
System.out.println("123");
int i =0;
while(i<1000000000){
i++;
}
}
@Test(expectedExceptions = NullPointerException.class)
public void testSub(){
System.out.println("456");
throw new NullPointerException();
}
@Test(dependsOnMethods = {"testTime","testSub"})
public void testMethond(){
System.out.println(0);
}
@DataProvider(name="user")
public Object[][] getStr(){
return new Object[][]{
{ "", "", "账号不能为空" },
{ "admin"," " ,"密码不能为空" },
{ " ", "a123456","账号不能为空" },
{ "ad ", "123456","账号“ad”不存在" },
{ "admin","12345" ,"密码错误" },
};
}
@Test(dataProvider = "user")
private void sout(String uname,String pword,String msg){
System.out.println(uname+"->"+pword+"->"+msg);
}
}
执行上面的代码,可以看到 beforeClass/afterClass
只执行一次,而 beforeMethod/afterMethod
执行了两次。
在 @Test
注解中添加 timeOut 参数就可以进行超时测试,@Test(timeOut=10)
表示测试方法的运行时间应该低于 10ms,如果超时者测试失败。超时测试对于网络连接类的测试相当有用。超时测试具体用法如下
@Test(timeOut = 1)
public void testSub() {
int i =0;
while (i < 1000000000) {
i++;
}
}
异常测试用于测试方法是否有抛出异常,通过 @Test(expected=NullPointerException.class)
来指定方法必须抛出 NullPointerException
,如果没有抛出异常或者抛出其他异常则测试失败。
@Test(expectedExceptions = NullPointerException.class)
public void testSub() {
throw new NullPointerException();
}
有时候需要测试方法按照一个特定的顺序被调用,这个时候需要使用 @Test
注解的 dependsOnMethods
参数来指定依赖方法和方法的执行顺序
// test1 执行之前会先执行 test2, test3
@Test(dependsOnMethods = {"test2","test3"})
public void test1(){
}
@Test
public void test2(){
}
@Test
public void test3(){
}
提供数据的一个测试方法。注解的方法必须返回一个Object[] [],其中每个对象 []的测试方法的参数列表中可以分配。该@Test 方法,希望从这个 DataProvider 的接收数据,需要使用一个 dataProvider 名称等于这个注解的名字。
第一种用法 :返回Object[][]
@DataProvider(name="user")
public Object[][] getStr(){
return new Object[][]{
{ "", "", "账号不能为空" },
{ "admin"," " ,"密码不能为空" },
{ " ", "a123456","账号不能为空" },
{ "ad ", "123456","账号“ad”不存在" },
{ "admin","12345" ,"密码错误" },
};
}
@Test(dataProvider = "user")
private void sout(String uname,String pword,String msg){
System.out.println(uname+"->"+pword+"->"+msg);
}
DataProvider返回的是一个Object的二维数组,二维数组中的每个一维数组都会传递给调用函数,作为参数使用。运行的时候,会发现, @Test标识的test method被执行的次数和object[][]包含的一维数组的个数是一致的,而@Test标识的函数的参数个数,也和object内一维数组内的元素数是一致的。