下面是我的TestNG套件xml文件。
<test name="m_AggregatorTx">
<parameter name="logFile" value="hadoopmslogs/${Domain_Name}/${NODENAME}/Hive_961/m_AggregatorTx.log"/>
<classes>
<class name="executems.main.RunMS"></class>
</classes>
</test>
<test name="m_alldt">
<parameter name="logFile" value="hadoopmslogs/${Domain_Name}/${NODENAME}/Hive_961/m_alldt.log"/>
<parameter name="enableUT" value="true"/>
<classes>
<class name="executems.main.RunMS"></class>
</classes>
</test>
<test name="m_alldt_cpx">
<parameter name="logFile" value="hadoopmslogs/${Domain_Name}/${NODENAME}/Hive_961/m_alldt_cpx.log"/>
<classes>
<class name="executems.main.RunMS"></class>
</classes>
</test>
<test name="m_alldt_custom_query_prop">
<parameter name="logFile" value="hadoopmslogs/${Domain_Name}/${NODENAME}/Hive_961/m_alldt_custom_query_prop.log"/>
<parameter name="enableUT" value="true"/>
<classes>
<class name="executems.main.RunMS"></class>
</classes>
</test>
在运行时,我想忽略没有enableUT参数的测试。例如,在上面的套件文件中,m_AggregatorTx和m_alldt_cpx中没有enableUT参数。
注意: 1.我不想向我的套件xml添加enabled=true/false。(因为我有30个不同的套件文件,每个套件都有100个测试用例) 2。目前,在运行时,我可以使用抛出新的SkipException来跳过这些测试。但是,一旦运行完成,结果如下:
=============================================== Hive_961
测试运行总数: 4,失败: 0,跳闸:2
=============================================== Hive_961
测试运行总数: 2,失败: 0,跳闸:0
if(enableBugB.equals("true"))
{
System.out.println("enableBugB is set to true in this Test Case");
boolean result = Services.runMapping(applicationName, mappingName, database, runID);
if(runID != null && !runID.isEmpty())
{
VerifyMapping.compareResults(verifyXml, runID, logPath,result);
}
else
{
VerifyMapping.compareResults(verifyXml, mappingName, logPath,result);
}
}
else
{
//System.out.println("enableBugB is not present for this Test. Hence skipping this Test Case..");
throw new SkipException("enableBugB is not enabled. Skipping this Test Case..");
}感谢你的帮助。谢谢。
发布于 2017-04-02 03:03:27
是的,这是可能的。
您将需要访问测试上下文。
基本上在testng.xml中
<suite name="Parameter Checker">
<listeners>
<listener class-name="listeners.ParametrizedMethodInterceptor" />
</listeners>
<test name="Without Parameter">
<classes>
<class name="TestClass" />
</classes>
</test>
<test name="With Parameter">
<parameter name="Name of the Parameter" value="Value of the Parameter" />
<classes>
<class name="TestClass" />
</classes>
</test>
</suite>然后,任何可以捕获该参数的值并在测试前运行的侦听器。我尝试使用反射的IAnnotationTransformer来实现它,但是如果没有方法实例化,就不可能访问参数的值,而且也没有测试上下文。
然而,对于IMethodInterceptor,它很简单:
public class ParametrizedMethodInterceptor implements IMethodInterceptor {
@Override
public List<IMethodInstance> intercept(List<IMethodInstance> list,
ITestContext iTestContext) {
String parameterValue = iTestContext
.getCurrentXmlTest()
.getParameter("Name of the Parameter");
return (parameterValue != null)? list : new LinkedList<>();
}
}这些被截获的方法没有依赖关系,也不依赖于任何其他测试方法。
考试班:
public class TestClass {
@Test
@Parameters("Name of the Parameter")
public void testMethod(@Optional("unset") String parameter) {
System.out.print("In testMethod. ");
System.out.println("Parameter: " + parameter + ".");
}
}输出:
In testMethod. Parameter: Value of the Parameter.
Test ignored.对于报表生成,请尝试使用两个侦听器:
<listeners>
<listener class-name="listeners.ParametrizedMethodInterceptor" />
<listener class-name="listeners.ParametrizedReportListener" />
</listeners>以及跳过不带参数的测试结果处理:
public class ParametrizedReportListener implements IReporter {
@Override
public void generateReport(List<XmlSuite> xmlSuites,
List<ISuite> suites,
String outputDirectory) {
for(ISuite suite : suites) {
suite.getResults().values().stream()
.filter(result -> result
.getTestContext()
.getCurrentXmlTest()
.getParameter("Name of the Parameter") != null)
.forEach(result -> {
System.out.println("Parameter found!");
System.out.println("Output formatting here.");
});
}
}
}https://stackoverflow.com/questions/43156994
复制相似问题