<suite name="Suite1" verbose="1" >
<test name="Nopackage" >
<classes>
<class name="NoPackageTest" />
</classes>
</test>
<test name="Regression1">
<classes>
<class name="test.sample.ParameterSample"/>
<class name="test.sample.ParameterTest"/>
</classes>
</test>
</suite>
<suite>...</suite> 表示定义了的一个测试套件。
name 定义测试套件的名称。
verbose 定义命令行信息打印等级,不会影响测试报告输出内容;可选值(1|2|3|4|5)
<test>...</test> 表示定义了一个测试。
name 定义测试的名称。
<classes>...</classes> 表示定义一组测试类。
<class .../> 表示定义一个测试类。
name 指定要运行的测试类
通过 testng.xml 文件来配置测试用例的执行
1、用例级别
在我们创建测试用例时,大概分三个层级。
- 测试包(目录)
- 测试类(文件)
- 测试用例(@Test 注解的方法)
<packages>...</packages> 定义一组测试包。
<package.../> 定义一个测试包。
name 指定测试包(目录)的名称。
<methods>...</methods> 定义一组测试方法。
<include.../> 指定包含的测试用例(方法)。
name 指定测试用例(方法)的名称
注意: 测试方法<methods>必须包含在<class>标签中。
2、用例分组
TestNG 允许我们给测试用例贴标签。我们可以根据这些标签有选择地的跳过或执 行这些用例。
<groups>...</groups> 测试组标签。
<run>...</run> 运行测试。
<exclude> 根据groups的设置,排除不执行的用例。
<include> 根据groups的设置,指定执行的测试用例。
3、用例执行顺序
- preserve-order 参数用于控制测试用例的执行顺序。
- 如果为:true,测试用例的顺序为:testCase > testCase1 > testCase2。
- 如果为:false ,那么默认会按照用例的名称的有字母/数字的顺序执行:testCase1 > testCase2 > testCase3。
4、用例依赖
- dependsOnGroups 来设置组的依赖,testAdd1()和 testAdd2() 同属于于 funtest组,testAdd3() 依赖于funtest组,该组有中有一条用例运行失败,则testAdd3() 不再执行。
5、用例参数化
(1)通过 @Parameters 实现参数化
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import static org.testng.AssertJUnit.assertEquals;
public class DataProviderTest {
@Test
@Parameters({"add1","add2","result"})
public void testAdd1(int add1, int add2, int result){
assertEquals(add1+ add2, result);
}
}
@Parameters 获取参数化数据,作为 testAdd1() 测试方法的参数。
具体的测试数据在 testng.mxl 文件中设置。
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="测试套件">
<test name="简单测试">
<parameter name="add1" value="3"/>
<parameter name="add2" value="2"/>
<parameter name="result" value="5"/>
<classes>
<class name="test.sample.DataProviderTest" />
</classes>
</test>
</suite>
<parameter.../> 定义测试数据name 定义数据的名字,在测试用例中通过该名字来获取对应的vlaue。value 定义测试数据,通过对应的name来获取该值。
(2)通过 @DataProvider 实现参数化
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static org.testng.AssertJUnit.assertEquals;
public class DataProviderTest {
// 定义对象数组
@DataProvider(name = "add")
public Object[][] Users() {
return new Object[][] {
{ 3, 2, 5 },
{ 2, 2, 4 },
{ 3, 3, 7 },
};
}
@Test(dataProvider="add")
public void testAdd2(int add1, int add2, int result){
assertEquals(add1+add2, result);
}
}
- @DataProvider 定义对象数组,数组的名称为:add 。
在 testAdd2() 中通过 dataProvider="add" 调用定义的对象数组,并通过参数获取相应的测试数据。
6、多线程运行用例
这里只介绍 testng.xml 文件,其中的使用到的测试用例,请参考前面的章节创建。
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="测试套件" parallel="classes" thread-count="2" >
<test name="简单测试">
<classes>
<class name="test.sample.FirstTest" />
<class name="test.sample.SecondTest" />
</classes>
</test>
</suite>
- parallel 设置多线程的级别划分。
- parallel=“methods”: TestNG将在不同的线程中运行所有的测试方法。依赖方法也将在单独的线程中运行,但它们将尊重你指定的顺序。
- parallel=“tests”: TestNG 将在同一个线程中运行相同的标记的所有方法,但是每个标记将在一个单独的线程中。这允许你将所有非线程安全的类分组在同一个中,并保证它们将在同一个线程中运行,同时利用尽可能多的线程来运行测试。
- parallel=“classes”: TestNG将在同一个线程中运行同一个类中的所有方法,但是每个类都将在一个单独的线程中运行。
- parallel=“instances”: TestNG将在同一个线程中运行相同实例中的所有方法,但是在两个不同实例上的两个方法将在不同的线程中运行。
- thread-count 用于指定线程的个数。