groups分组,可以用在方法上,也可以用在类上。我们可以根据需要,灵活地对方法和类进行分组。
一、组测试中的方法分组测试
通过@Test注解的groups属性,将一个测试类中的before/after方法分组执行。
import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;
public class GroupsOnMethod {
@Test(groups = "server")
public void test1(){
System.out.println("服务端组的测试方法1");
}
@Test(groups = "server")
public void test2(){
System.out.println("服务端组的测试方法2");
}
@Test(groups = "client")
public void test3(){
System.out.println("客户端组的测试方法3");
}
@Test(groups = "client")
public void test4(){
System.out.println("客户端组的测试方法4");
}
@BeforeGroups("server")
public void beforeGroupsOnServer(){
System.out.println("服务端组运行之前执行的方法");
}
@AfterGroups("server")
public void afterGroupsOnServer(){
System.out.println("服务端组运行之后执行的方法");
}
@BeforeGroups("client")
public void beforeGroupsOnClient(){
System.out.println("客户端组运行之前执行的方法");
}
@AfterGroups("client")
public void afterGroupsOnClient(){
System.out.println("客户端组运行之后执行的方法");
}
}
执行结果如下:
二、组测试中的类分组测试
组类要运行的类可以自定义,可以包括要执行的,排除不要执行的方法。必须和<classes>配套使用,从下面的类中找到对应名字的方法、
<groups>由<define>和<run>、<dependencies>三部分组成。
- <define>可以将group组成一个新组,包括要执行和不执行的大组;
- <run>要执行的方法;
- <dependencies>指定了某group需要依赖的group
GroupsOnClass1.java
package com.course.testng.groups;
import org.testng.annotations.Test;
@Test(groups = "stu")
public class GroupsOnClass1 {
public void stu1(){
System.out.println("GroupsOnClass1中的stu1运行");
}
public void stu2(){
System.out.println("GroupsOnClass1中的stu2运行");
}
}
GroupsOnClass2.java
package com.course.testng.groups;
import org.testng.annotations.Test;
@Test(groups = "stu")
public class GroupsOnClass2 {
public void stu1(){
System.out.println("GroupsOnClass2中的stu1运行");
}
public void stu2(){
System.out.println("GroupsOnClass2中的stu2运行");
}
}
GroupsOnClass3.java
package com.course.testng.groups;
import org.testng.annotations.Test;
@Test(groups = "teacher")
public class GroupsOnClass3 {
public void teacher1(){
System.out.println("GroupsOnClass3中的teacher1运行");
}
public void teacher2(){
System.out.println("GroupsOnClass3中的teacher2运行");
}
}
groupsOnClass.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="suiteName">
<!--class1/2/3中的测试类都执行-->
<test name="runAll">
<classes>
<class name="com.course.testng.groups.GroupsOnClass1"/>
<class name="com.course.testng.groups.GroupsOnClass2"/>
<class name="com.course.testng.groups.GroupsOnClass3"/>
</classes>
</test>
<!--使用groups标签,只执行group name为stu的测试类-->
<test name="onlyRunStu">
<groups>
<run>
<include name="stu"/> <!--只执行group name为stu的测试类-->
</run>
</groups>
<classes>
<class name="com.course.testng.groups.GroupsOnClass1"/>
<class name="com.course.testng.groups.GroupsOnClass2"/>
<class name="com.course.testng.groups.GroupsOnClass3"/>
</classes>
</test>
</suite>
运行groupsOnClass.xml,结果如下
三、组中组测试
分组测试在配置时,TestNG执行的原则是:只保留最小集合进行执行
//使用groups进行分组测试,include和exclude的原则是保留最小集合
public class TestngGroups {
@Test(groups = { "functest", "checkintest" })
public void testMethod1() {
System.err.println("groups = { functest, checkintest }");
}
@Test(groups = { "functest", "checkintest" })
public void testMethod2() {
System.err.println("groups = { functest, checkintest }");
}
@Test(groups = { "functest" })
public void testMethod3() {
System.err.println("groups = { functest }");
}
@Test(groups = { "checkintest" })
public void testMethod4() {
System.err.println("groups = { checkintest }");
}
}
testng-groups.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="framework_testng">
<test verbose="2" name="TestGroups">
<groups>
<run>
<include name="functest" />
<exclude name="checkintest" />
</run>
</groups>
<classes>
<class name="com.dragon.testng.annotation.TestngGroups" />
</classes>
</test>
</suite>
执行结果:
当我们的测试用例累积了很多以后,我们可能不需要测试之前的分组,只要测试刚刚写好的分组,这时候testng提供了一种新的配置方式,来实现这一功能,让测试人员只修改配置文件就完成测试。
组中组,即在groups标签内,使用<define>标签在现有组名的基础上,自定义一些分组(可以理解为按组名为单位,再一次分组),方便groups调用这些分组。比如下面例子中,define了名为all的组,包括组名windows.xp/windows.7/windows.8的测试类,此时在run中可以直接<include> all就可以完成组名为windows.xp/windows.7/windows.8的测试类的调用。
/**
* 使用<define>标签将测试方法在组内再次进行分组并以name属性进行区分,
* <run>通过define标签的name进行调用,以后修改测试直接修改run调用的名称即可
*/
public class TestngGroupsOfGroups {
@Test(groups = { "windows.xp" })
public void testMethod5() {
System.err.println("(groups = { windows.xp })");
}
@Test(groups = { "windows.7" })
public void testMethod6() {
System.err.println("(groups = { windows.7 })");
}
@Test(groups = { "windows.8" })
public void testMethod7() {
System.err.println("(groups = { windows.8 })");
}
}
testng-groupOfGroups.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="framework_testng">
<test verbose="2" name="TestGroupsOfGroups">
<groups>
<define name="xp">
<include name="windows.xp" />
</define>
<define name="w7">
<include name="windows.7" />
</define>
<define name="all">
<include name="windows.*" />
</define>
<run>
<include name="all" />
<exclude name="w7" />
</run>
</groups>
<classes>
<class name="com.dragon.testng.annotation.TestngGroupsOfGroups" />
</classes>
</test>
</suite>
测试结果:(注意:此时 被运行的测试分组将在run标签内进行配置,include和exclude时,是根据Define标签的name来决定)