TestNg注解使用

1.TestNG常用注解

@Test 标记一个类或方法作为测试的一部分

@BeforeMethod 注解的方法将在每个测试方法运行之前运行

@AfterMethod 注解的方法将在每个测试方法运行之后运行

@BeforeClass 注解的方法将只运行一次,在当前类中所有方法运行之前调用

@AfterClass 注解的方法将只运行一次,在当前类中所有方法运行之后调用

@BeforeSuite 标记的方法:在某个测试套件(suite)开始之前运行

@AfterSuite标记的方法:在某个测试套件(suite)所有的测试方法执行之后运行

@BeforeGroups 此方法是保证在运行属于任何这些组第一个测试方法,该方法被调用

@AfterGroups此方法是保证在运行属于任何这些组最后一个测试方法后,该方法被调用

@BeforeTest 是针对xml文件中的test标签进行操作,在xml中的每一个test标签执行前运行

@AfterTest 是针对xml文件中的test标签进行操作,在xml中的每一个test标签执行后运行

1.1代码示例

 1 public class BasicAnnotince {
 2 //    最基本的注解,用来把方法标记为测试的一部分
 3     @Test(groups = "1")
 4     public void testCase1() {
 5         System.out.println("我是测试用例1");
 6     }
 7     @Test(groups = "2")
 8     public void testCase2() {
 9         System.out.println("我是测试用例2");
10     }
11     @BeforeMethod
12     public void beforeMethod1() {
13         System.out.println("beforeMethod-在每一个测试用例执行之前运行");
14     }
15     @AfterMethod
16     public void afterMethod2() {
17         System.out.println("afterMethod-在每一个测试用例执行之后运行");
18     }
19     @BeforeClass
20     public void beforeClass1() {
21         System.out.println("beforeClass1-在当前类中方法运行之前调用");
22     }
23     @AfterClass
24     public void afterClass1() {
25         System.out.println("afterClass1-在当前类中所有方法运行之后调用");
26     }
27     @BeforeSuite
28     public void beforeSuite1() {
29         System.out.println("beforeSuite运行了");
30     }
31     @AfterSuite
32     public void afterSuite1() {
33         System.out.println("afterSuite运行了");
34     }
35     @BeforeTest
36     public void beforeTest1() {
37         System.out.println("beforeTest-在测试方法开始之前运行");
38     }
39     @AfterTest
40     public void afterTest1() {
41         System.out.println("afterTest1-在测试方法结束之后运行");
42     }
43     @BeforeGroups("1")
44     public void beforeGroups() {
45         System.out.println("beforeGroups-111111");
46     }
47     @AfterGroups("1")
48     public void afterGroups() {
49         System.out.println("afterGroups-111111");
50     }
51 }

1.2运行结果

2.套件测试

2.1代码示例

 1 public class SuiteConfig {
 2     @BeforeSuite
 3     public void beforeSuite(){
 4         System.out.println("before suite运行啦");
 5     }
 6 
 7     @AfterSuite
 8     public  void aftersuite(){
 9         System.out.println("after suite 运行啦");
10     }
11 
12     @BeforeTest
13     public void beforeTest(){
14         System.out.println("beforeTest");
15     }
16 
17     @AfterTest
18     public void afterTest(){
19         System.out.println("afterTest");
20     }
21 }

2.2运行结果

3.忽略测试:@Test(enabled = false)

3.1代码示例

 1 public class IgnoreTest {
 2     @Test
 3     public void ignore1() {
 4         System.out.println("ignore1");
 5     }
 6     @Test(enabled = false)
 7     public void ignore2() {
 8         System.out.println("ignore2");
 9     }
10 }

3.2运行结果

4.组测试@Test(groups = "组名"),@BeforeGroups("组名"),@AfterGroups("组名")

4.1代码示例

 1 public class GroupsTest {
 2     @Test(groups = "server")
 3     public void test1() {
 4         System.out.println("这是服务端的测试方法1");
 5     }
 6     @Test(groups = "server")
 7     public void test2() {
 8         System.out.println("这是服务端的测试方法2");
 9     }
10     @Test(groups = "client")
11     public void test3() {
12         System.out.println("这是客户端的测试方法3");
13     }
14     @Test(groups = "client")
15     public void test4() {
16         System.out.println("这是客户端的测试方法4");
17     }
18     @BeforeGroups("server")
19     public void beforeGroupsOnServer() {
20         System.out.println("这是服务端组运行之前执行的方法");
21     }
22     @AfterGroups("server")
23     public void afterGroupsOnServer() {
24         System.out.println("这是服务端组运行之后执行的方法");
25     }
26 }

4.2运行结果

5.类分组测试@Test(groups = "组名"),xml中include标签name属性为组名

5.1代码示例

1 @Test(groups = "tea")
2 public class GroupsOnClass2 {
3     public void test1() {
4         System.out.println("GroupsOnClass2中test1方法");
5     }
6     public void test2() {
7         System.out.println("GroupsOnClass2中test2方法");
8     }
9 }
1 @Test(groups = "stu")
2 public class GroupsOnClass1 {
3     public void test1() {
4         System.out.println("GroupsOnClass1中test1方法");
5     }
6     public void test2() {
7         System.out.println("GroupsOnClass1中test2方法");
8     }
9 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <suite name="test1">
 3     <test name="onlyRunStu">
 4         <groups>
 5             <run>
 6                 <include name="stu"/>
 7             </run>
 8         </groups>
 9         <classes>
10             <class name="com.test.testng.GroupsOnClass1"/>
11             <class name="com.test.testng.GroupsOnClass2"/>
12         </classes>
13     </test>
14 </suite>

5.2运行结果

6.异常测试@Test(expectedExceptions = 异常类名)

6.1代码示例

1 public class ExceptionTest {
2     @Test(expectedExceptions = RuntimeException.class)
3     public void runTimeExceptionSuccess() {
4         System.out.println("这是成功的异常测试");
5         throw new RuntimeException();
6     }
7 }

6.2运行结果

7.依赖测试:@Test(dependsOnMethods = {"XXX方法名"} ) ,当被依赖的方法执行失败,依赖的方法忽略

7.1代码示例

 1 public class DependsTest {
 2     @Test
 3     public void test1() {
 4         System.out.println("test1 run");
 5         throw new RuntimeException();
 6     }
 7     @Test(dependsOnMethods = {"test1"})
 8     public void test2() {
 9         System.out.println("test2 run");
10     }
11 }

7.2运行结果

8.参数化测试——xml文件参数化

8.1代码示例

1 public class ParameterTest {
2     @Test
3     @Parameters({"name","age"})
4     public void paraTest(String name,int age) {
5         System.out.println("name="+name+",age="+age);
6     }
7 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <suite name="test2">
 3     <test name="para">
 4         <classes>
 5         <!--注意   parameter中的name要跟@Parameters中的对应-->
 6             <parameter name="name" value="张三"></parameter>
 7             <parameter name="age" value="23"></parameter>
 8             <class name="com.test.testng.ParameterTest"/>
 9         </classes>
10     </test>
11 </suite>

9.参数化测试——DataProvider参数化

9.1代码示例

 1 public class DataProviderTest {
 2 //    dataProvider要跟@DataProvider的name属性值一致
 3     @Test(dataProvider = "data")
 4     public void paraTest(String name,int age) {
 5         System.out.println("name="+name+",age="+age);
 6     }
 7     @DataProvider(name = "data")
 8     public Object[][] dataProvider(){
 9         Object[][] o = new Object[][] {
10             {"张三",23},
11             {"李四",24},
12             {"王五",25}
13         };
14         return o;
15     }
16 }

9.2运行结果

9.3根据方法名传值

9.3.1代码示例

 1 public class DataProviderTest {
 2 //    dataProvider要跟@DataProvider的name属性值一致
 3     @Test(dataProvider = "methodData")
 4     public void Test1(String name,int age) {
 5         System.out.println("Test111方法中name="+name+",age="+age);
 6     }
 7     @Test(dataProvider = "methodData")
 8     public void Test2(String name,int age) {
 9         System.out.println("Test222方法中name="+name+",age="+age);
10     }
11     @DataProvider(name = "methodData")
12     public Object[][] dataProvider(Method method){
13         Object[][] o = null;
14         if (method.getName().equals("Test1")) {
15             o= new Object[][] {
16                 {"张三",23},
17             };
18         }else if (method.getName().equals("Test2")) {
19             o= new Object[][] {
20                 {"李四",24},
21             };
22         }else {
23             o= new Object[][] {
24                 {"王五",25}
25             };
26         }
27         
28         return o;
29     }
30 }

9.3.2运行结果

10.多线程测试——注解方式实现

10.1代码示例

 1 public class MultiThreadOnAnnotice {
 2     /*
 3      * nvocationCount----表示执行的次数
 4         threadPoolSize-----表示线程池的内线程的个数
 5      * */
 6     @Test(invocationCount = 10,threadPoolSize = 3)
 7     public void test1() {
 8         System.out.println("MultiThreadOnAnnotice_test1_Thread Id :"+Thread.currentThread().getId());
 9     }
10 }

10.2运行结果

11.多线程测试——xml文件实现

11.1parallel:methods级别

11.1.1代码示例

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <suite name="multi" parallel="methods" thread-count="3">
 3     <!--
 4     tests级别:不同的test tag下的用例可以在不同的线程下执行
 5             相同的test tag下的用例只能在同一个线程中去执行
 6     classs级别:相同的class tag 下的用例在同一个线程中执行
 7                 不同的class tag 下的用例可以在不同的线程中执行
 8     methods级别:所有用例都可以在不同的线程下去执行
 9 
10     thread-count:代表了最大并发线程数
11 
12     xml文件配置这种方式不能指定线程池,只有方法上才可以指定线程池
13     -->
14     <test name="test1">
15         <classes>
16             <class name="com.test.testng.MutliThreadOnXml"/>
17         </classes>
18     </test>
19 </suite>

11.1.2运行结果

11.2parallel:tests级别-不同test tag时

11.2.1代码示例

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <suite name="multi" parallel="tests" thread-count="3">
 3     <test name="test1">
 4         <classes>
 5             <class name="com.test.testng.MutliThreadOnXml"/>
 6         </classes>
 7     </test>
 8     <test name="test2">
 9         <classes>
10             <class name="com.test.testng.MutliThreadOnXml"/>
11         </classes>
12     </test>
13 </suite>

11.2.2运行结果

11.3parallel:tests级别-相同test tag时

11.3.1代码示例

1 <?xml version="1.0" encoding="UTF-8"?>
2 <suite name="multi" parallel="tests" thread-count="3">
3     <test name="test1">
4         <classes>
5             <class name="com.test.testng.MutliThreadOnXml"/>
6         </classes>
7     </test>
8 </suite>

11.3.2运行结果

11.4parallel:classes级别

11.4.1代码示例

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <suite name="multi" parallel="classes" thread-count="3">
 3     <test name="test1">
 4         <classes >
 5             <class name="com.test.testng.MutliThreadOnXml"/>
 6             <class name="com.test.testng.ExceptionTest"/>
 7         </classes>
 8     </test>
 9     <test name="test2">
10         <classes >
11             <class name="com.test.testng.MutliThreadOnXml"/>
12         </classes>
13     </test>
14 </suite>

11.4.2运行结果

12超时测试——@Test(timeOut = 毫秒值)

12.1代码示例

1 public class TimeOutTest {
2     @Test(timeOut = 3000)
3     public void timeOutfail() throws InterruptedException {
4         Thread.sleep(4000);
5     }
6 
7 }

12.2运行结果

原文地址:https://www.cnblogs.com/heyuling/p/12066989.html