13 代码中运行testNG
可以在自己的代码中运行Testng
TestListenerAdapter tla = new TestListenerAdapter();TestNG testng = new TestNG();testng.setTestClasses(new Class[] { Run2.class });testng.addListener(tla);testng.run();
在上面代码中创建一个TestNG对象并运行测试类Run2。也增加了TestListener。我们可以使用适配器类org.testng.TestListenerAdapter 或者自己实现接口
org.testng.ITestListener
。这个接口包含不同的回调方法,这些方法让我们跟踪测试启动,运行成功和失败等
类似的,我们可以用testng.xml来调用TestNG,或者创建一个虚拟的testng.xml。为了实现这个,我们可以使用包
org.testng.xml
中的类
XmlClass
,
XmlTest
, 等。每个类对应XML的标签。
假如要创建如下的虚拟文件:
<suite name="TmpSuite">
<test name="TmpTest">
<classes>
<class name="test.failures.Child"/>
</classes>
</test>
</suite>
可以使用如下的代码:
XmlSuite suite=new XmlSuite();
suite.setName("TmpSuite");
XmlTest test=new XmlTest(suite);
test.setName("TmpTest");
List<XmlClass> classes=new ArrayList<XmlClass>();
classes.add(new XmlClass("test.failures.Child"));
test.setXmlClasses(classes);
然后使用下面的代码将XMLsuite传给TestNG:
List<XmlSuite> suites = new ArrayList<XmlSuite>();suites.add(suite);TestNG tng = new TestNG();tng.setXmlSuites(suites);tng.run();
要了解所有API,可以参考JavaDocs
14 BeanShell和高级分组选择
如果testng.xml中<include>和<exclude>标签并不能满足需求,可以使用BeanShell表达式来觉得一个测试方法是否应该或者不应该包含在测试中。可以直接在<test>标签下指定表达式:
<test name="BeanShell test">
<method-selectors>
<method-selector>
<script language="beanshell">
<![CDATA[ groups.containsKey("test1") ]]>
</script>
</method-selector>
</method-selectors>
<!-- ... -->
当TesngNG发现在testng.xml中有标签<script>时,会忽略当前<test>标签后续(
subsequent)的<include>和<exclude>的分组和测试方法:Beanshell表达式是唯一的决定一个测试方法是否允许的方法。
下面是关于BeanShell额外的信息:
- 必须返回boolean值。除了这一约束,任何有效的程序代码是允许的。
- TestNG为了方便定义下属变量:
java.lang.reflect.Method method:当前测试方法
org.testng.ITestNGMethod testngMethod
: 当前测试方法的描述
java.util.Map<String, String> groups
: 当前测试方法所属的分组的Map
- 为了避免繁琐的XML引用,使用CDATA声明包围表达式,