如何在testNG中使用java反射将测试类名称作为输入参数传递?

时间:2017-11-29 23:28:05

标签: selenium jenkins reflection automated-tests testng

我通过Jenkins执行testNG脚本。我有大约75个测试类,但我只想运行特定的测试用例。为此,我需要将测试类名称传递给testNG.XML文件。显然,这可以通过反思来实现,但我不知道如何继续这样做。任何提示都将不胜感激。

3 个答案:

答案 0 :(得分:0)

为了实现将测试类名传递给testNG.xml的目标,请考虑以编程方式创建testNG xml。 TestNG对象提供此功能。请参阅下面的示例代码。

        public static void main(){
         TestNG myTestNG = new TestNG();     
         XmlSuite mySuite = new XmlSuite();
         mySuite.setName("AdviserWebTestSuite");        

         List<XmlTest> myTests = new ArrayList<XmlTest>();

             XmlTest myTest = new XmlTest(mySuite);

             myTest.setName("Created_testsuite_on_runtime");         
             myTest.setXmlClasses(Arrays.asList(new XmlClass("com.example.tests.class1Test")));
             myTest.setXmlClasses(Arrays.asList(new XmlClass("com.example.tests.class2Test")));
             myTest.setXmlClasses(Arrays.asList(new XmlClass("com.example.tests.class3Test")));

             myTests.add(myTest);

         mySuite.setTests(myTests);
         List<XmlSuite> mySuites = new ArrayList<XmlSuite>();
         mySuites.add(mySuite);
         myTestNG.setXmlSuites(mySuites);
         myTestNG.run();
}

答案 1 :(得分:0)

这样做你不需要反思。假设您有一个已有的TestNG xml文件,那么您所要做的就是将一个BeanShell部分添加到您的套件xml文件中,该文件可以检查传入的ITestNGMethod对象的类名,并根据是否匹配,方法可以包括在内。

这是一个完整的工作示例。有关详细信息,请参阅我的博文here

头等舱

package com.rationaleemotions.stackoverflow.qn47563557;

import org.testng.annotations.Test;

public class FirstClass {
    @Test
    public void testMethod() {
        System.err.println("FirstClass() says Hello");
    }
}

第二课

package com.rationaleemotions.stackoverflow.qn47563557;

import org.testng.annotations.Test;

public class SecondClass {
    @Test
    public void testMethod() {
        System.err.println("SecondClass() says Hello");
    }
}

利用beanhell的TestNG套件xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="47563557_Suite" verbose="2" parallel="tests" thread-count="10">
    <test name="47563557_Tests">
        <method-selectors>
            <method-selector>
                <script language="beanshell">
                    <![CDATA[
                    whatClass = System.getProperty("classname", "com.rationaleemotions.stackoverflow.qn47563557.FirstClass");
                    currentClass = testngMethod.getTestClass().getName();
                    currentClass.equals(whatClass);
                ]]>
                </script>
            </method-selector>
        </method-selectors>
        <packages>
            <package name="com.rationaleemotions.stackoverflow.qn47563557"/>
        </packages>
    </test>
</suite>

<强>输出

...
... TestNG 6.13.1 by Cédric Beust (cedric@beust.com)
...
FirstClass() says Hello
PASSED: testMethod

===============================================
    47563557_Tests
    Tests run: 1, Failures: 0, Skips: 0
===============================================

===============================================
47563557_Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================

<强>解释

这里我们使用JVM参数classname,通过它我们可以考虑完全限定的类名,以便TestNG可以在其中运行测试。我们还添加了一个默认值,以便某人不会传递任何我们仍然需要运行的东西。

您可以增强上面的beanshell以接受类名的csv(逗号分隔值),然后拆分csv,遍历其值以决定运行哪个类以及不运行哪个类。

但这应该让你开始。

答案 2 :(得分:0)

我认为你可以用beanshell

来做到这一点

我是从here

复制粘贴的
Mapper.Initialize(cfg =>
{
    cfg.ShouldMapProperty = pi => pi.PropertyType != typeof(ICommand);
});

另外,看看here