以下是我的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.目前在运行时,我可以使用throw new SkipException跳过这些测试。但是一旦运行结束,结果就是这样:
=============================================== Hive_961
=============================================== Hive_961
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..");
}
感谢任何帮助。感谢。
答案 0 :(得分:1)
是的,有可能。
您需要访问测试上下文。
基本上在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.");
});
}
}
}