一.注解
前面TestNG入门使用中说的每一个特点就是TestNG的使用,比如第一个特点是注解,那下面就看看注解到底如何使用的。
注解 | 描述 |
@BeforeSuite | 在该套件的所有测试都运行在注释的方法之前,仅运行一次。 |
@AfterSuite | 在该套件的所有测试都运行在注释方法之后,仅运行一次。 |
@BeforeClass | 在调用当前类的第一个测试方法之前运行,注释方法仅运行一次。 |
@AfterClass | 在调用当前类的第一个测试方法之后运行,注释方法仅运行一次 |
@BeforeTest | 注释的方法将在属于<test> 标签内的类的所有测试方法运行之前运行。 |
@AfterTest | 注释的方法将在属于<test> 标签内的类的所有测试方法运行之后运行。 |
@BeforeGroups | 配置方法将在之前运行组列表。 此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行。 |
@AfterGroups | 此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行。 |
@BeforeMethod | 注释方法将在每个测试方法之前运行。 |
@AfterMethod | 注释方法将在每个测试方法之后运行。 |
@DataProvider | 标记一种方法来提供测试方法的数据。 注释方法必须返回一个 |
@Factory | 将一个方法标记为工厂,返回TestNG 将被用作测试类的对象。 该方法必须返回Object [] 。 |
@Listeners | 定义测试类上的侦听器。 |
@Parameters | 描述如何将参数传递给@Test 方法。 |
@Test | 将类或方法标记为测试的一部分。 |
注意:套件测试是什么东西? - 套件测试是一起运行的多个测试类。
二.使用
1.不知道大家发现没有,虽然注解很多,但其实前大半部分注解的都是类似的,比如BeforeSuite,那就对应一个AferSuite,其他也是类似的,所以在这里,只会挑其一进行说明。
以代码展示,大家就会清楚很多,上代码
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
/**
* @Author xx
* @Date 2020/11/22
**/
public class TestAnnotation {
@Test
public void test(){
System.out.println("test");
}
@Test
public void test1(){
System.out.println("test1");
}
@Test
public void test2(){
System.out.println("test2");
}
@BeforeSuite
public void testBeforeSuite(){
System.out.println("BeforeSuite");
}
@AfterSuite
public void testAfterSuite(){
System.out.println("AfterSuite");
}
@BeforeClass
public void testBeforeClass(){
System.out.println("BeforeClass");
}
@AfterClass
public void testAfterClass(){
System.out.println("AfterClass");
}
@BeforeTest
public void testBeforeTest(){
System.out.println("BeforeTest");
}
@AfterTest
public void testAfterTest(){
System.out.println("AfterTest");
}
@BeforeGroups
public void testBeforeGroups(){
System.out.println("BeforeGroups");
}
@AfterGroups
public void testAfterGroups(){
System.out.println("AfterGroups");
}
@BeforeMethod
public void testBeforeMethod(){
System.out.println("BeforeMethod");
}
@AfterMethod
public void testAfterMethod(){
System.out.println("AfterMethod");
}
}
输出结果如下:
BeforeSuite
BeforeTest
BeforeClass
BeforeMethod
test
AfterMethod
BeforeMethod
test1
AfterMethod
BeforeMethod
test2
AfterMethod
AfterClass
AfterTest
AfterSuite
===============================================
Default Suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================
Process finished with exit code 0
2.@DataProvider
what:标记一种方法来提供测试方法的数据。 注释方法必须返回一个Object [] []
,其中每个Object []
可以被分配给测试方法的参数列表。 要从该DataProvider
接收数据的@Test
方法需要使用与此注释名称相等的dataProvider
名称。
why:
- DataProvider可以实现类似Factory的数据驱动的测试,而且使用DataProvider的时候,被测试方法所在的类只被创建一次,只是方法被调用多次,所以比较省时省力
- DataProvider还可以实现懒加载,在需要测试大量数据的时候可以一条一条的加载数据,而不需要一次性把数据加载到内存中,避免了内存的浪费,和可能的内存不够用的危险
how:
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* @Author xx
* @Date 2020/11/22
**/
public class TestDataProvider {
@DataProvider(name = "provider")
public Object[][] dataProvider(){
Object [][] provider = new Object [5][2];
for (int i = 0; i < provider.length; i++) {
provider[i][0] = "name"+i;
provider[i][1] = i+10;
}
return provider;
}
@Test(dataProvider="provider")
public void testDataProvider(String name,int age){
System.out.println(name+"_"+age);
}
}
输出结果如下:
name0_10
name1_11
name2_12
name3_13
name4_14
===============================================
Default Suite
Total tests run: 5, Failures: 0, Skips: 0
===============================================
Process finished with exit code 0
3.@Factory
what:将一个方法标记为工厂,返回TestNG
将被用作测试类的对象。 该方法必须返回Object []
。
why:
@Factory必须放在一个返回对象数组的顶部,所有的这些对象都包含测试类的实例,testng会确保@Factory只被调用一次。
@Factory方法是首先被调用的,在@Test方法和配置方法之前,只有当所有的@Factory方法被调用之后,testng才开始执行配置和测试方法。
@Factory允许在运行时动态测试。
@Factory注解的方法必须是返回一个对象数组的方法。而且这些返回的对象数组中的对象必须包含TestNG annotation的类的实例。
how:
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
/**
* @Author xx
* @Date 2020/11/22
**/
public class TestFactory {
@Test
public void simpleTest1(){
System.out.println("simple test one");
}
@Test
public void simpleTest2(){
System.out.println("simple test two");
}
@Factory
public Object[] factoryMethod() {
return new Object[] { new TestFactory(), new TestFactory() };
}
}
输出结果如下:
simple test one
simple test one
simple test two
simple test two
===============================================
Default Suite
Total tests run: 4, Failures: 0, Skips: 0
===============================================
Process finished with exit code 0
5.@Parameters
how:java类中定义参数名@Parameters({
"paraName"
}
);在TestNG.xml中设置参数值<
parameter
name
=
"paraName"
value
=
"paraValue"
/>
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
/**
* @Author xx
* @Date 2020/11/22
**/
public class TestParameters {
@Parameters({ "first-name" })
@Test
public void test(String name){
System.out.println("name:"+name);
}
}
对应的xml文件如下
<suite name="Suite" parallel="classes" thread-count="3">
<test verbose="2" preserve-order="true" name="TestDebug">
<parameter name="first-name" value="名称" />
<classes>
<class name="TestParameters" />
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->