testNG的使用

时间:2021-07-14
本文章向大家介绍testNG的使用,主要包括testNG的使用使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.testNG的注解与属性

@BeforeSuite:在该套件的所有的测试都运行在注解方法之前,仅运行一次               @AfterSuite:在该套件的所有的测试都运行在注解方法之后,仅运行一次

@BeforeClass:在调用当前类的第一个测试方法之前运行,注解方法仅运行一次          @AfterClass:在调用当前类的第一个测试方法之后运行,注解方法仅运行一次

@BeforeTest:注解方法将在属于<test>标签的类的所有测试方法运行之前运行          @AfterTest:注解方法将在属于<test>标签的类的所有测试方法运行之后运行

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

@Test:将类和方法标记为测试的一部分

@DataProvider 标记一种方法来提供测试方法的数据,注解方法必须返回一个Object[][],其中每个Object[]可以被分配给测试方法的参数列表。要从该DataProver接收数据的@Test方法,就需要使用与此注解名称相等的dataProvider名称

dataProvider 选定传入参数的构造器

enabled: 默认为true,如果指定为false,则表示不执行该测试方法

groups:指定该测试方法所属的组,可以指定多个组,以逗号隔开

invocationCount:指测试方法需要被调用的次数

priority:测试方法优先级设置,数值越低,优先级越高

下面举例:

package testng;

import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class Annotations {
    @BeforeSuite  
      public void beforeSuite() {
          System.out.println("beforeSuite.......");
      }
      @BeforeMethod
      public void beforeMethod() {
          System.out.println("beforeMethod.......");
      }
      @BeforeClass
      public void beforeClass() {
          System.out.println("beforeClass.......");
      }
      @BeforeTest
      public void beforeTest() {
          System.out.println("beforeTest.......");
      }
      @Test
      public void test1() {
          System.out.println("这是第一个测试......");
          Assert.assertEquals(add(1,1), 2);
      }
      @Test
      public void test2() {
          System.out.println("这是第二个测试......");
      }
      @AfterTest
      public void afterTest() {
          System.out.println("afterTest......");
      }
      @AfterClass
      public void afterClass() {
          System.out.println("afterClass......");
      }
      @AfterMethod
      public void afterMethod() {
          System.out.println("afterMethod......");
      }
      @AfterSuite
      public void afterSuite() {
          System.out.println("afterSuite......");
      }
      
      public int add(int i,int j){
          return i+j;
      }
}

结果输出如下:

beforeSuite.......
beforeTest.......
beforeClass.......
beforeMethod.......
这是第一个测试......
afterMethod......
beforeMethod.......
这是第二个测试......
afterMethod......
afterClass......
afterTest......
PASSED: test1
PASSED: test2

===============================================
Default test
Tests run: 2, Failures: 0, Skips: 0
===============================================

afterSuite......

===============================================
Default suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================

[TestNG] Time taken by org.testng.reporters.jq.Main@156643d4: 24 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@7d6f77cc: 5 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@5d22bbb7: 6 ms
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@1c4af82c: 23 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 1 ms
[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@69222c14: 2 ms

2.套件测试

测试套件是用来串联测试用例脚本的,可以通过灵活配置来执行想要执行的测试用例脚本,通俗的讲,就是将一个或者多个测试用例(测试类)放在一起运行,也称为套件测试

目前文件结构如下:

在testng文件夹下创建第一个类,类名为TestSuiteDemo1,

 具体代码如下:

package testng;

import org.testng.annotations.Test;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;

public class TestSuiteDemo1 {
  @Test
  public void f() {
      System.out.println("this is TestSuiteDemo1 testcase");
  }
  @BeforeClass
  public void beforeClass() {
      System.out.println("this is beforeClass");
  }

  @AfterClass
  public void afterClass() {
      System.out.println("this is afterClass");
  }

}

在testng文件夹下创建第二个类,类名为TestSuiteDemo2具体代码如下:

package testng;

import org.testng.annotations.Test;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;

public class TestSuiteDemo2 {
  @Test
  public void f() {
      System.out.println("this is TestSuiteDemo1 testcase");
  }
  @BeforeClass
  public void beforeClass() {
      System.out.println("this is beforeClass");
  }

  @AfterClass
  public void afterClass() {
      System.out.println("this is afterClass");
  }

}

然后右键工程>>TestNG>>Convert to TestNG 生成一个testng.xml文件,具体代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" verbose="1"  parallel="false" thread-count="1">
  <test name="Test">
    <classes>
    <!-- 套件测试类示例代码1 -->
      <class name="testng.TestSuiteDemo1"/>
      <!-- 套件测试类示例代码2 -->
      <class name="testng.TestSuiteDemo2"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

代码解析:suit为根节点且只能有一个,name属性为必需属性,verbose的意思是在控制台中如何输出,一般值为1,不写也可以,parallel的意思是使用多线程编程,通过thread-count属性可以设置线程数

直接运行这个xml文件,会运行class为testng.TestSuiteDemo1和testng.TestSuiteDemo2中的所有测试方法,运行结果如下:

[TestNG] Running:
F:\auto_ceshi\javaProject\src\testng\testng.xml

this is beforeClass
this is TestSuiteDemo1 testcase
this is afterClass
this is beforeClass
this is TestSuiteDemo1 testcase
this is afterClass

===============================================
Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================

3.忽略测试

有时我们编写的测试用例脚本未开发完全,不具备执行测试的条件,就需要等功能健壮或则脚本开发完成之后再去执行测试,这是就可以使用注解@Test(enabled=false)禁用不想执行的测试用例

创建一个名为TestIgnore的类,具体代码如下:

package testng;

import org.testng.annotations.Test;

public class TestIgnore {
    //忽略测试  默认enable=true
  @Test
  public void test1() {
      System.out.println("这条测试用例会被执行");
  }
  @Test(enabled=false)
  public void test2() {
      System.out.println("enbaled=true时,这条测试用例会被执行");
  }
  @Test(enabled=true)
  public void test3() {
      System.out.println("这条测试用例会被执行");
  }
  
}

输出结果如下:

这条测试用例会被执行
这条测试用例会被执行
PASSED: test1
PASSED: test3

4.分组测试

 创建一个名为TestGroup的类,具体代码如下:

package testng;

import org.testng.annotations.Test;

public class TestGroup {
    //分组测试
  @Test(groups="group1")
  public void test1() {
      System.out.println("我是第一组读者");
  }
  @Test(groups="group3")
  public void test2() {
      System.out.println("我是第三组读者");
  }
  @Test(groups="group3")
  public void test3() {
      System.out.println("我是第三组读者");
  }
  @Test(groups="group1")
  public void test4() {
      System.out.println("我是第一组读者");
  }
  @Test(groups="group1")
  public void test5() {
      System.out.println("我是第一组读者");
  }
  @Test(groups="group1")
  public void test6() {
      System.out.println("我是第一组读者");
  }
}

testng.xml文件中添加如下代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" verbose="1"  parallel="false" thread-count="1">
  <test name="Test">
  <groups>
      <run>
      <!-- 只包含一组 -->
          <include name="group1"></include>   
          <!-- 除了三组 -->
          <exclude name="group3"></exclude>
      </run>
  </groups>
    <classes>
<!--       分组测试 -->
      <class name="testng.TestGroup"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

代码解析:

groups标签是分组,run标签是执行,include标签是包含,exclude标签是不包含

输出结果如下:

我是第一组读者
我是第一组读者
我是第一组读者
我是第一组读者

5.异常测试

异常测试是在单元测试中一个非常重要的环节,即全路径的覆盖测试,用于验证程序的健壮性和可靠性,比如接口测试中传入某些不合法的参数,程序就会抛出异常,在程序中我们期望得到某种类型的异常的时候,就需要用到异常测试,通过@Test(expected=""Expection.class)来指定必须抛出某种类型的异常,如果没有抛出异常,测试就会失败

package testng;

import org.testng.annotations.Test;

public class TestException {
  @Test(expectedExceptions=NullPointerException.class)
  public void f() {
      throw new NullPointerException();
  }
}

6.依赖测试

有时需要测试方法按照特定的顺序被调用,这个时候需要使用@Test注解的dependsOnMethod参数来指定所依赖的方法

创建一个测试类,名为TestDependsOnGroups,具体代码如下:

public class TestDependsOnGroups {
    //依赖测试示例    在test1执行前先执行test2和test3
  @Test(dependsOnMethods={"test2","test3"})
  public void test1() {
      System.out.println("test1执行了");
  }
  @Test
  public void test2() {
      System.out.println("test2执行了");
  }
  @Test
  public void test3() {
      System.out.println("test3执行了");
  }
}

运行结果如下:

test2执行了
test3执行了
test1执行了
PASSED: test2
PASSED: test3
PASSED: test1

7.参数话测试

TestN中常用的有@Parameters 和DataProvider两种注解

第一种@Parameter

创建一个测试类,名为TestParam,代码如下

package testng;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestParam {
  @Parameters({"username","password"})
  @Test
  public void f(String username,String password) {
      System.out.println(username+"t"+password);
  }
  
}

然后在testng.xml文件中添加下面代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" verbose="1"  parallel="false" thread-count="1">
  <test name="Test">
  <parameter name="username" value="dandan"></parameter>
  <parameter name="password" value="12345678"></parameter>
    <classes>
      <class name="testng.TestParam"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

运行结果如下:

dandant12345678

第二种 @DataProvider

创建一个类,名为TestLogin,具体代码如下:

package testng;

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestLogin {
  @Test(dataProvider="testlogin")
  public void testlogin(String username,String password) {
      System.out.println("用户名为"+username+"  "+"密码为"+password);
  }
  @DataProvider(name="testlogin")
  public Object[][] testlogin(){
      return new Object[][]{
          {"","12345678"},{"dandan",""},{"dandan","12345678"}
      };
  }
  
}

输出结果为:

用户名为 密码为12345678
用户名为dandan 密码为
用户名为dandan 密码为12345678
PASSED: testlogin("", "12345678")
PASSED: testlogin("dandan", "")
PASSED: testlogin("dandan", "12345678")

原文地址:https://www.cnblogs.com/cdd9162/p/15012008.html