如何将动态参数传递给 testNG.xml 运行多个测试

Posted

技术标签:

【中文标题】如何将动态参数传递给 testNG.xml 运行多个测试【英文标题】:How to pass dynamic parameter TO testNG.xml run multiple tests 【发布时间】:2019-06-30 14:25:25 【问题描述】:

我有发送多个测试和多个参数的 xml 套件。

示例:

        <test name="Create">       
        <classes>       
        <class name="TestClass">
            <methods>
                <parameter name="offerId" value="1234"/>
                <include name="testmethod"/>
            </methods>
        </class>                                          
      </classes>
      </test>
        <test name="Add">       
        <classes>       
        <class name="TestClass2">
            <methods>
                <include name="testmethod2"/>
            </methods>
        </class>                                          
      </classes>
      </test>

我需要多次运行这个类,每次都使用不同的 offerId 参数。 (例如 1234,4567,7899)

我只想运行这个请求一次,它会刺激所有不同的参数并一次又一次地运行整个套装,并在同一个报告上给出结果。

这就是我所做的:

@Test
public void runSuites2()

    TestNG testng = new TestNG();
    List<String> suites=new ArrayList<String>();
    suites.add("c:/tests/testng1.xml");//path to xml..

    testng.setTestSuites(suites);
    testng.run();


所以这将加载并运行我需要的套装,但是如何更改套装内的参数? (之后我将创建 for 循环)

[目前我复制了 xml 并手动更改了每个测试的参数。然后运行套件]

测试:

@Parameters( "offerId" )
@Test
public void testmethod(String offerId, ITestContext context) throws Exception 
    Reporter.log("offer ID is = " + offerId, true);
        

【问题讨论】:

您可以在其中添加您正在使用 offerId 参数的 testMethod 代码吗? 添加了java测试@SameerArora 请参考并关注***.com/questions/46224926/… @IdanShabat 让我知道答案是否对您有帮助 :) 嗨@SameerArora - 感谢您的意见,但这没有帮助。它确实从属性文件运行了测试,但我需要在同一个参数上多次运行相同的测试。当我向同一个参数添加不同的值时 - 它采用最新的并且不会运行两次。 【参考方案1】:

在这种情况下,您可以使用 dataprovider,或者您可以从 excel 中读取值,并且将为 dataprovider/excel 表中的每个值运行测试。 为您提供有关如何将 dataprovider 用于您的测试用例的示例。

@DataProvider(name = "offerId")
public static Object[][] voiceSearchTestData() 
    return new Object[][]
            1234,
            2345,
            4567
    ;


@Test(dataProvider = "offerId")
public void testmethod(int offerId, ITestContext context) throws Exception 
    Reporter.log("offer ID is = " + offerId, true);

所以上述测试将运行 3 次,每个值对应于 dataprovider 中的每个值,您不需要在 testng xml 中进行任何参数化。您只需要提及类名,所有测试都会自动运行。你的 testng.xml 应该是这样的:

<test name="SampleTest">
    <classes>
        <class name="packageName.className" />
    </classes>
</test>

【讨论】:

嗨@Sameer Arora。也感谢这个答案。这样我就可以多次运行相同的测试,但是有没有一种方法可以把整个西装,运行整个西装,而不仅仅是参数?我对同一套西装进行了多次测试,所以我希望它: 1.开始运行西装 - 运行一些测试。 2.当它击中欲望类(测试)时,使用第一个参数。 3. 继续西装并运行更多参数。 4.回到第一步并再次运行——直到列表中没有更多参数为止【参考方案2】:

以下代码的作用: 我想在运行时为每个参数添加一个列表。这些参数作为 Maven 运行时参数传递。它们是使用System.getProperty() 方法读取的,如下所示。然后把这些参数加到&lt;test&gt;里面&lt;suite&gt;里面,testng就跑成功了。这在其他场景中也非常有用。

以下代码读取testng.xml文件并添加参数

List<String> parameters = new ArrayList<>();
parameters = Arrays.asList(System.getProperty("parameters").split(",");

TestNG tng = new TestNG();
File initialFile = new File("testng.xml");
InputStream inputStream = FileUtils.openInputStream(initialFile);
Parser p = new Parser(inputStream);
List<XmlSuite> suites = p.parseToList();
for(XmlSuite suite:suites)
    List<XmlTest> tests = suite.getTests();
    for (XmlTest test : tests) 
         for (int i = 0; i < parameters.size(); i++) 
            HashMap<String, String> parametersMap = new HashMap<>();
            parametersMap.put("parameter",parameters.get(i));
            test.setParameters(parametersMap);
        
    

tng.setXmlSuites(suites);
tng.run();

【讨论】:

以上是关于如何将动态参数传递给 testNG.xml 运行多个测试的主要内容,如果未能解决你的问题,请参考以下文章

如何将相同的事件侦听器分配给 Vue.js 中动态创建的按钮并将对象的值作为参数传递给它?

是否存在某种方式将自定义参数传递给 Firebase 上的短动态链接?

如何将参数传递给 Java 线程?

在 Kubeflow 中运行自定义容器时,如何将参数传递给容器?

如何将参数传递给SQL(Excel)中的查询

如何将命令行参数传递给 unix/linux 系统上正在运行的进程?