TestNG是一套开源的单元测试框架,它的灵感来源于JUnit,但其功能比JUnit强大,它支持更多的注解、并行测试、更多的参数化方法等。TestNG和JUnit都是java中常用的单元测试框架,二者的共同点有:
TestNG相较于JUnit有如下特点:
TestNG依赖
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
注解 | 描述 |
---|---|
@BeforeSuite | 标记的方法会在当前测试套件(Suite)中的所有测试用例开始运行之前执行,仅运行一次 |
@AfterSuite | 标记的方法会在当前测试套件中的所有测试用例运行结束后执行,仅运行一次。 |
@BeforeClass | 在调用当前类的第一个测试方法之前运行,注释方法仅运行一次 |
@AfterClass | 在调用当前类的所有方法之后运行,注释方法仅运行一次 |
@BeforeTest | 注解的方法将在属于test标签内的类的所有测试方法运行之前运行 |
@AfterTest | 注解的方法将在属于test标签内的类的所有测试方法运行之后运行 |
@BeforeMethod | 注解方法将在每个测试方法之前运行 |
@AfterMethod | 注解方法将在每个测试方法之后运行 |
@DataProvider | 标记一个提供测试数据的方法。 注解方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。 要从该DataProvider接收数据的@Test方法需要使用与此注解名称相同的dataProvider名称 |
@Factory | 将一个方法标记为工厂,返回TestNG将被用作测试类的对象。 该方法必须返回Object [] |
@Listeners | 定义测试类上的侦听器 |
@Parameters | 描述如何将参数传递给@Test方法 |
@Test | 将类或方法标记为测试的一部分,此标记若放在类上,则该类所有公共方法都将被作为测试方法。属性有:alwaysRun、DataProvider、DataProviderClass、dependsOnGroups、dependsOnMethods、description、enabled、expectedException、groups、invocationCount、invocationTimeOut、priority、successPercentage、singleThreaded、timeOut、threadPoolSize |
执行顺序:@BeforeSuite >@BeforeTest >@BeforeClass >@BeforeMethod
@BeforeSuite
public void beforeSuite(){
System.out.println("Suite-最先执行");
}
@AfterSuite
public void afterSuite(){
System.out.println("Suite-最后执行");
}
@BeforeTest
public void beforeTest(){
System.out.println("Test-最先执行");
}
@AfterTest
public void afterTest(){
System.out.println("Test-最后执行");
}
@BeforeClass
public static void beforeClass(){
System.out.println("Class-最先执行");
}
@AfterClass
public static void afterClass(){
System.out.println("Class-最后执行");
}
@BeforeMethod
public static void before(){
System.out.println("method-方法之前");
}
@AfterMethod
public static void after(){
System.out.println("method-方法之后");
}
@Test
public void test1(){
System.out.println("方法001");
}
@Test
public void test2(){
System.out.println("方法002");
}
@Test
public void test3(){
System.out.println("方法003");
}
用于对测试结果进行验证的方法,可以判断测试是否通过
1.assertEquals判断两个对象是否相等,如果步行等则抛出异常AssertionError
2.assertTrue判断给定条件是否为true,如果不为true则抛出异常AssertionError
示例
@Test
public void test01(){
System.out.println("用例001");
Assert.assertEquals(1,2,"期望的是2,实际是1");
}
@Test
public void test02(){
System.out.println("用例002");
Assert.assertEquals("test","test");
}
@Test
public void test03(){
System.out.println("用例003");
Assert.assertTrue(1==2);
}
@Test
public void test04(){
System.out.println("用例004");
Assert.assertTrue(1==1);
}
测试过程中,遇到还没解决的问题,可以先忽略,使用注解@Ignore标注不执行该方法。
@Test
@Ignore
public void test01(){
System.out.println("用例001");
Assert.assertEquals(1,2,"期望的是2,实际是1");
}
@DataProvider,@Test和@DataProvider必须一起使用,DataProvider的作用:
实现步骤:
1.定义一个函数,使用@DataProvider注解,给@DataProvider定义一个名称,该函数返回一个二维对象数组
2.使用这个参数的方法,在@Test中指定dataProvider的名称
@DataProvider(name="test")
Object[][] parmas(){
return new Object[][]{
{"tom",10},
{"jerry",11}
};
}
@Test(dataProvider = "test")
public void test(String name,int age){
System.out.println(name+","+age);
}
执行顺序:priority,设置用例执行顺序
@Test(priority = 2)
public void test01(){
System.out.println("用例001");
Assert.assertTrue(1==1);
}
@Test(priority = 1)
public void test02(){
System.out.println("用例002");
Assert.assertEquals("test","test");
}
超时:timeOut,超时设置,超过设定时间则执行失败,报异常ThreadTimeoutException
@Test(timeOut = 1000)
public void test01() throws InterruptedException {
Thread.sleep(2000);
System.out.println("用例001");
}
依赖:dpendsOnMethods,如果被依赖方法执行失败,有依赖关系的方法不会被执行,比如上传失败,就不会执行下载操作。
dpendsOnMethods和@BeforeMethod的区别:BeforeMethod在每个方法执行前都要执行,而dpendsOnMethods只在依赖的方法前执行
@Test
public void test01(){
System.out.println("被依赖的方法001");
Assert.assertTrue(false);
}
@Test(dependsOnMethods = {"test01","test03"})
public void test02(){
System.out.println("依赖test01和test03方法");
}
@Test
public void test03(){
System.out.println("被依赖的方法002");
}