首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种完全基于条件(如果测试中不存在参数)而忽略测试的方法

是否有一种完全基于条件(如果测试中不存在参数)而忽略测试的方法
EN

Stack Overflow用户
提问于 2017-04-01 12:41:07
回答 1查看 233关注 0票数 2

下面是我的TestNG套件xml文件。

代码语言:javascript
复制
<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

  1. 我不希望这两个案例出现在Skips部分的结果。我想让那些案子在运行时被忽略。我想得到这样的结果:

=============================================== Hive_961

测试运行总数: 2,失败: 0,跳闸:0

代码语言:javascript
复制
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..");

                }

感谢你的帮助。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-04-02 03:03:27

是的,这是可能的。

您将需要访问测试上下文。

基本上在testng.xml

代码语言:javascript
复制
<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,它很简单:

代码语言:javascript
复制
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<>();
    }
}

这些被截获的方法没有依赖关系,也不依赖于任何其他测试方法。

考试班:

代码语言:javascript
复制
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 + ".");
    }
}

输出:

代码语言:javascript
复制
In testMethod. Parameter: Value of the Parameter.

Test ignored.

对于报表生成,请尝试使用两个侦听器:

代码语言:javascript
复制
<listeners>
    <listener class-name="listeners.ParametrizedMethodInterceptor" />
    <listener class-name="listeners.ParametrizedReportListener" />
</listeners>

以及跳过不带参数的测试结果处理:

代码语言:javascript
复制
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.");
                    });
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43156994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档