有没有办法完全根据条件忽略测试(如果测试中不存在参数)

时间:2017-04-01 12:41:07

标签: testing

以下是我的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

运行总测试:4,失败:0,跳过:2

  1. 我不希望这两个案例显示在结果的“跳过”部分中。我希望在运行时忽略这些情况。 我想要的结果是这样的:
  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..");
    
                    }
    

    感谢任何帮助。感谢。

1 个答案:

答案 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.");
                    });
        }
    }
}