我有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+ xmls。
答案 0 :(得分:0)
完成此任务的一种方法是执行以下操作:
6.13.1
org.testng.IAlterSuiteListener
<listeners>
标记连接此侦听器。以下是一个完整的示例,显示了所有这些内容。
示例测试类
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
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