TestNG执行顺序
@BeforeMethod :测试方法运行之前运行
@AfterMethod: 测试方法运行之后运行
@BeforeClass:类方法之前运行(静态的方法,变量赋值)
@BeforeClass:类方法之后运行
@BeforeSuite:测试套件,Suite可以包含多个class,在class运行之前
@AfterSuite:测试套件,Suite可以包含多个class,在class运行之后
运行TestNG测试脚本(https://www.cnblogs.com/superbaby11/p/6400400.html)
运行TestNG测试脚本有两种方式:一种是直接通过IDE运行(例如使用eclipse中的“Run TestNG tests”),另一种是从命令行运行(通过使用xml配置文件)
- 首先要声明一个suite的名字,用于描述将要运行的测试脚本集,可以根据自己需要任意命名,最终这个名字会在testng的测试报告中看到。
<suite name="test">
<test name="login">
<classes>
<class name="com.course.testng.suite.SuiteConfig"/>
<class name="com.course.testng.suite.LoginTest"/>
</classes>
</test>
<test name="pay">
<classes>
<class name="com.course.testng.suite.SuiteConfig"/>
<class name="com.course.testng.suite.PayTest"/>
</classes>
</test>
</suite>
忽略测试
@Test(enabled = false)
组测试
public class GroupOnMethod {
@Test(groups = "server")
public void test1(){
System.out.println("这是服务端组的测试方法1111");
}
@Test(groups = "server")
public void test2(){
System.out.println("这是服务端组的测试方法2222");
}
@Test(groups = "client")
public void test3(){
System.out.println("这是服务端组的测试方法3333");
}
@Test(groups = "client")
public void test4(){
System.out.println("这是服务端组的测试方法4444");
}
@BeforeGroups("server")
public void beforeGroupOnServer(){
System.out.println("这是服务端组运行之前的方法");
}
@AfterGroups("server")
public void afterGroupOnserver(){
System.out.println("这是服务端组运行之后的方法");
}
@BeforeGroups("client")
public void beforeGroupOnClient(){
System.out.println("这是客户端组运行之前的方法");
}
@AfterGroups("client")
public void afterGroupOnClient(){
System.out.println("这是客户端组运行之后的方法");
}
}
运行结果:
这是服务端组运行之前的方法
这是服务端组的测试方法1111
这是服务端组的测试方法2222
这是服务端组运行之后的方法
这是客户端组运行之前的方法
这是服务端组的测试方法3333
这是服务端组的测试方法4444
这是客户端组运行之后的方法
组测试中的类分组测试
<?xml version="1.0" encoding="UTF-8" ?>
<suite name="suitename">
<test name="runall">
<classes>
<class name="com.course.testng.groups.GroupOnClass1"/>
<class name="com.course.testng.groups.GroupClass2"/>
<class name="com.course.testng.groups.GroupOnClass3"/>
</classes>
</test>
<!-- 只运行class name为stu的文件-->
<test name="runOnly">
<groups>
<run>
<include name="stu"></include>
</run>
</groups>
<classes>
<class name="com.course.testng.groups.GroupOnClass1"/>
<class name="com.course.testng.groups.GroupClass2"/>
<class name="com.course.testng.groups.GroupOnClass3"/>
</classes>
</test>
</suite>
异常测试
package com.course.testng;
import org.testng.annotations.Test;
public class ExpectedException {
@Test(expectedExceptions = RuntimeException.class)
public void runTimeException(){
System.out.println("这是一个异常测试");
throw new RuntimeException();
}
}
依赖测试
public class DependTest {
@Test
public void test1(){
System.out.println("test1执行");
//test1抛出异常test2就不执行
throw new RuntimeException();
}
//test1执行成功才能执行test2
@Test(dependsOnMethods = {"test1"})
public void test2(){
System.out.println("test1执行");
}
}
参数化测试
- xml配置文件参数化
public class paramterTest {
@Test
@Parameters({"name","age"})
public void parameter(String name,int age){
System.out.println("name="+name+"; age"+age);
}
}
配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<suite name = "param">
<test name = "parame">
<classes>
<parameter name = "name" value = "zhangsan"></parameter>
<parameter name = "age" value = "10"></parameter>
<class name="com.course.testng.paramter.paramterTest"></class>
</classes>
</test>
</suite>
dataProvider
public class dataParameter {
@Test(dataProvider = "data")
public void datapara(String name, int age) {
System.out.println("name=" + name + ";age=" + age);
}
@DataProvider(name = "data")
public Object[][] providerData() {
Object[][] o = new Object[][]{
{"zhangsan", 10},
{"lisi", 20}
};
return o;
}
@Test(dataProvider = "dataMethod")
public void test1(String name, int age) {
System.out.println("test1中name=" + name + ";age=" + age);
}
@Test(dataProvider = "dataMethod")
public void test2(String name, int age) {
System.out.println("test2中name=" + name + ";age=" + age);
}
@DataProvider(name = "dataMethod")
public Object[][] dataMethod(Method method) {
Object[][] result = null;
if (method.getName().equals("test1")) {
result = new Object[][]{
{"zhangsan",40}
};
}else if (method.getName().equals("test2")){
result = new Object[][]{
{"lisi",60}
};
}
return result;
}
}
多线程测试注解 (适合各个线程之间无关联)
public class MultiTreadOnAnnotation {
@Test(invocationCount = 10,threadPoolSize = 3)
public void test1(){
System.out.println(1);
System.out.printf("Thread Id %s%n",Thread.currentThread().getId());
}
}