是的,又是闲的蛋疼的我,最近在思考自动化测试活动架构,所以参照着 dtd 和网上别人的经验,整理了一份完整版的 testng xml,给有需要的童鞋吧。至于里面标注 todo 的部分,这是我在网上没找到令我满意的说明,准备以后有时间试验过再确定的内容。以上。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!--suite(测试套件)为根路径,仅允许出现1次,是多个test(测试用例)的集合,以下为各属性含义及取值
@name 必填,标记suite的名称
@junit 选填,是否以junit模式运行,可选值(true|false) 默认值"false"
@verbose 选填,命令行信息打印等级(与测报内容无关),可在测试代码注释中配置,可选值(1|2|3|4|5)
@parallel 选填,是否多线程并发运行测试,可选值(false | methods | tests | classes | instances),默认 "false"
@thread-count 选填,填写值为正整数,当为并发执行时的线程池数量,默认为"5"
@configfailurepolicy 一旦Before/After Class/Methods这些方法失败后,是继续执行测试还是跳过测试;可选值 (skip | continue),默认"skip
@annotations="javadoc" 获取注解的位置,如果为"javadoc", 则使用javadoc注解,否则使用jdk注解
@time-out 为具体执行单元设定一个超时时间,具体参照parallel的执行单元设置;单位为毫秒
@skipfailedinvocationcounts 是否跳过失败的调用,可选值(true | false),默认"false"
@data-provider-thread-count 并发执行时data-provider的线程池数量,默认为"10"
@object-factory 一个实现IObjectFactory接口的类,用来实例测试对象
@allow-return-values="true" 是否允许返回函数值,可选值(true | false),默认"false"
@preserve-order:顺序执行开关,可选值(true | false) "true"
@group-by-instances:是否按实例分组,可选值(true | false) "false"
@guice-stage 支持使用JSR-330的@Inject注解来配置运行时提供的实例
@parent-module 和Guice框架有关,只运行一次,创建一个parent injector给所有guice injectors
-->
<suite name="suitename" junit="false" verbose="3" parallel="false" thread-count="5" configfailurepolicy="skip"
annotations="javadoc" time-out="10000" skipfailedinvocationcounts="true" data-provider-thread-count="5"
object-factory="classname" allow-return-values="true" preserve-order="true" group-by-instances="false">
<!--可以执行多个suite,@path 必填,欲引用的suitefile的绝对路径-->
<suite-files>
<suite-file path="/path/to/suitefile1"></suite-file>
</suite-files>
<!--全局参数,@name和@value必填,分别为参数名和参数值-->
<parameter name="par1" value="value1"></parameter>
<parameter name="par2" value="value2"></parameter>
<!--方法选择器,在suite/test中增加需要额外执行的类(根据父标签而定),及安排执行优先级-->
<method-selectors>
<method-selector>
<!--
@name 必填
@priority 选填
-->
<selector-class name="classname" priority="1"></selector-class>
<!--
@language 必填
-->
<script language="java"></script>
</method-selector>
</method-selectors>
<!--test定义一次测试执行,以下为各属性含义及取值
@name:必填,test的名字,测试报告中会有体现
@junit:选填,是否以Junit模式运行,可选值(true | false),默认"false"
@verbose:选填,命令行信息打印等级,不会影响测试报告输出内容;可选值(1|2|3|4|5)
@parallel:选填,是否多线程并发运行测试;可选值(false | methods | tests | classes | instances),默认 "false"
@thread-count:选填,当为并发执行时的线程池数量,默认为"5"
@annotations:选填,获取注解的位置,如果为"javadoc", 则使用javadoc注解,否则使用jdk5注解
@time-out:选填,为具体执行单元设定一个超时时间,具体参照parallel的执行单元设置;单位为毫秒
@enabled:选填,设置当前test是否生效,可选值(true | false),默认"true"
@skipfailedinvocationcounts:选填,是否跳过失败的调用,可选值(true | false),默认"false"
@preserve-order:选填,顺序执行开关,可选值(true | false) "true"
@group-by-instances:选填,是否按实例分组,可选值(true | false) "false"
@allow-return-values:选填,是否允许返回函数值,可选值(true | false),默认"false"
-->
<test name="testename" junit="false" verbose="3" parallel="false" thread-count="5" annotations="javadoc"
time-out="10000" enabled="true" skipfailedinvocationcounts="true" preserve-order="true"
allow-return-values="true">
<!--局部参数,@name和@value必填,分别为参数名和参数值,如果参数名与全局参数一致,则覆盖全局参数取值-->
<parameter name="par1" value="value1"></parameter>
<parameter name="par2" value="value2"></parameter>
<!--搭配class使用,执行class内指定组-->
<groups>
<!--定义执行组名,在run中使用
@name 必填,组中组的名称
-->
<define name="xxx">
<!--定义包含的测试组,测试方法属于哪个测试组在测试代码注释中定义。
@name 必填,需要包含进组中组的组名
@description 选填,关于组的描述
@invocation-numbers 选填,执行次序或者执行次数——TODO
-->
<include name="" description="" invocation-numbers=""/>
<include name="" description="" invocation-numbers=""/>
</define>
<!--运行组中组的配置-->
<run>
<!--执行指定的组中组,@name必填,与define name一致-->
<include name=""/>
<!--排除指定的组中组,@name必填,与define name一致-->
<exclude name=""/>
</run>
<!--组中组的依赖配置-->
<dependencies>
<!--配置依赖
@name 必填,需要依赖其他组的组名,define中设置
@depends-on 必填,被依赖的组名,define中设置,可以有多个,用空格隔开
-->
<group name="" depends-on=""></group>
<group name="" depends-on=""></group>
</dependencies>
</groups>
<!--配置要执行的类,是多个class的集合-->
<classes>
<!--局部参数,@name和@value必填,分别为参数名和参数值,如果参数名与全局参数和父标签的局部参数一致,则覆盖全局参数和父标签的局部参数取值-->
<parameter name="par1" value="value1"></parameter>
<parameter name="par2" value="value2"></parameter>
<!--多个methods的集合,@name 必填,对应class的名称,如com.example.autotest.testcase-->
<class name="classname">
<!--要执行的方法,如为空,则执行整个class内包含的全部方法-->
<methods>
<!--局部参数,@name和@value必填,分别为参数名和参数值,如果参数名与全局参数和父标签的局部参数一致,则覆盖全局参数和父标签的局部参数取值-->
<parameter name="par3" value="value3"></parameter>
<!--类内要执行的测试方法名,在测试代码注释中配置,如设置inclde,则只执行该方法,其他跳过
@name 必填,执行方法名
@description 选填,方法描述
@invocation-number 选填,宣发执行顺序或执行次数——TODO
-->
<include name="" description="" invocation-numbers=""></include>
<!--除了该方法外,类内其他方法都执行,@name 必填,不执行的方法名-->
<exclude name=""></exclude>
</methods>
<methods></methods>
</class>
</classes>
<!--可以执行指定包下面所有类,是多个package的汇聚-->
<packages>
<!--配置要执行的包,@name 必填,要执行的package名,如com.example.autotest-->
<package name="">
<!--包内要执行的测试方法名,在测试代码注释中配置,如设置inclde,则只执行该方法,其他跳过
@name 必填,执行方法名
@description 选填,方法描述
@invocation-number 选填,宣发执行顺序或执行次数——TODO
-->
<include name="" description="" invocation-numbers=""></include>
<!--除了该方法外,包内其他方法都执行,name 必填,不执行的方法名-->
<exclude name=""></exclude>
</package>
</packages>
</test>
<!--设置监听的类名,可设置多个,class-name 必填,类名,如com.example.autotest.Listener-->
<listeners>
<listener class-name="classname1"/>
<listener class-name="classname2"/>
</listeners>
</suite>