我有30+ xml测试套件用于各种配置。最近我引入了 beanshell 脚本来处理动态组管理。这需要我修改每个 xml 以包含如下代码:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="testSuite" parallel="none" >
<test name="website general suite">
<method-selectors>
<method-selector>
<script language="beanshell">
<![CDATA[whatGroup = System.getProperty("groupToRun","");
if(whatGroup.isEmpty()){
return true;
}
else{
return groups.containsKey(whatGroup) ;
}
]]>
</script>
</method-selector>
</method-selectors>
<classes>
<class name="com.autoqa.website.tests.ExperiencePagesTests"/>
<class name="com.autoqa.website.tests.FooterTests"/>
<class name="com.autoqa.website.tests.HeroSliderTests"/>
<class name="com.autoqa.website.tests.PosterTests"/>
<class name="com.autoqa.website.tests.SimpleSmokeTests"/>
<class name="com.autoqa.website.tests.WhatsOnTests"/>
<class name="com.autoqa.website.tests.UTagJSTests"/>
<class name="com.autoqa.website.tests.UTagsProxyTests"/>
</classes>
</test> </suite>
当它工作时,我想知道是否有办法将此脚本放在一个地方并以简单的方式将其注入到每个 xml。所以,比如说,如果将来我想修改这个脚本,我只会做一次,而不是在 30+ xml 中。
完成此操作的一种方法是执行以下操作:
- 确保您使用的是最新版本的 TestNG,即
6.13.1
- 构建实现
org.testng.IAlterSuiteListener
的 TestNG 侦听器 - 通过套件 xml 文件中的
<listeners>
标记连接此侦听器。 - 如果需要,可以通过添加条件来丰富此侦听器,以便它根据某些特定条件将 beanshell 脚本相加。
下面是一个完整的示例,显示了所有这些操作。
示例测试类
package com.rationaleemotions.stackoverflow.qn48205890;
import org.testng.annotations.Test;
public class SampleTestClass {
@Test
public void a() {}
@Test
public void b() {}
@Test
public void c() {}
}
实现org.testng.IAlterSuiteListener
的 TestNG 侦听器
package com.rationaleemotions.stackoverflow.qn48205890;
import org.testng.IAlterSuiteListener;
import org.testng.xml.XmlMethodSelector;
import org.testng.xml.XmlScript;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
import java.util.Collections;
import java.util.List;
public class BeanShellScriptInjector implements IAlterSuiteListener {
@Override
public void alter(List<XmlSuite> suites) {
XmlSuite suite = suites.get(0);
XmlMethodSelector xms = new XmlMethodSelector();
XmlScript script = new XmlScript();
script.setLanguage("beanshell");
script.setScript("System.out.println("Running " + method.getName() + "()") ; return true;");
xms.setScript(script);
List<XmlMethodSelector> list = Collections.singletonList(xms);
XmlTest xmlTest = suite.getTests().get(0);
xmlTest.setMethodSelectors(list);
}
}
TestNG 套件 xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="45160355_Suite" parallel="false" verbose="2">
<listeners>
<listener class-name="com.rationaleemotions.stackoverflow.qn48205890.BeanShellScriptInjector"/>
</listeners>
<test name="45160355_test" verbose="2">
<classes>
<class name="com.rationaleemotions.stackoverflow.qn48205890.SampleTestClass"/>
</classes>
</test>
</suite>
控制台输出
...
... TestNG 6.13.1 by Cédric Beust (cedric@beust.com)
...
Running a()
Running b()
Running c()
Running a()
Running b()
Running c()
Running a()
Running b()
Running c()PASSED: a
PASSED: b
PASSED: c
===============================================
45160355_test
Tests run: 3, Failures: 0, Skips: 0
===============================================
===============================================
45160355_Suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================
Process finished with exit code 0