【问题标题】:How to add parameter at runtime in specific test如何在特定测试中在运行时添加参数
【发布时间】:2018-08-13 05:39:39
【问题描述】:

我在 suite.xml 文件中有多个测试标签,如下所示:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="1" verbose="1" name="UK-Suite"
    skipfailedinvocationcounts="false" junit="false" parallel="methods"
    data-provider-thread-count="2" annotations="JDK">

    <test verbose="2" name="AuthTxn-Tests"
        annotations="JDK" preserve-order="true">
        <parameter name="testDataFileXLS"
            value="src/test/resources/testdata/TxnTestData/AdjustTestCases.xlsx" />
        <parameter name="declineDataFileXLS"
            value="src/test/resources/testdata/TxnTestData/DoubeTests.xlsx" />
        <parameter name="token"
            value="src/test/resources/testdata/TestDefaults.json" />
        <classes>
            <class name="com.amazon.test.e2e.token.PPTest">
            </class>
        </classes>
    </test>
    <test verbose="2" name="LUTON-AuthTxn-Tests" annotations="JDK"
        preserve-order="true">
        <parameter name="testDataFileXLS"
            value="src/test/resources/testdata/TxnTestData/AuthTxnTestCases.xlsx" />
        <parameter name="declineDataFileXLS"
            value="src/test/resources/testdata/TxnTestData/DoubeTests.xlsx" />
        <parameter name="token"
            value="src/test/resources/testdata/TestDefaults.json" />
        <classes>
            <class name="com.amazon.test.e2e.token.PPTest">
            </class>
        </classes>
    </test>
    </suite>

我只想在运行时添加&lt;parameter name="OS" value="linux"/&gt;,然后再调用@Test 方法进行特定测试。所有测试标签都有一个通用类,但它会根据测试数据执行不同的流程执行。我只想在运行时为特定测试名称添加参数,例如“AuthTxn-Tests”。

有什么线索吗?

【问题讨论】:

    标签: java selenium testng


    【解决方案1】:

    你可以试试@Optional见javadoc

    TestNG 将使用您的默认值初始化此类参数,如果未指定任何参数,则为 null,并且测试不会因缺少参数而失败。

    【讨论】:

      【解决方案2】:

      使用this 链接,我编写了一些代码,您可以使用这些代码在您的xml 文件中动态添加&lt;parameter&gt;。它会在你的第一个 &lt;test&gt; 标签内的 &lt;classes&gt; 之前添加一个 &lt;parameter&gt; 元素 -

      try {
              String filepath = "path to your xml";
              DocumentBuilderFactory docFactory = 
              DocumentBuilderFactory.newInstance();
              DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
              Document doc = docBuilder.parse(filepath);
      
              Node test_tag = doc.getElementsByTagName("test").item(0);
              String name = "OS";
              String value = "Linux";
              NamedNodeMap attr = test_tag.getAttributes();
      
              // append a new node to test
              Element parameter = doc.createElement("parameter");
              parameter.setAttribute("name", name);
              parameter.setAttribute("value", value);
              test_tag.appendChild(parameter);
              Node classes = doc.getElementsByTagName("classes").item(0);
              test_tag.insertBefore(parameter, classes);
      
      
              // write the content into xml file
              TransformerFactory transformerFactory = TransformerFactory.newInstance();
              Transformer transformer = transformerFactory.newTransformer();
              DOMSource source = new DOMSource(doc);
              StreamResult result = new StreamResult(new File(filepath));
              transformer.transform(source, result);
      
              System.out.println("Done");
      
             } catch (ParserConfigurationException pce) {
              pce.printStackTrace();
             } catch (TransformerException tfe) {
              tfe.printStackTrace();
             } catch (IOException ioe) {
              ioe.printStackTrace();
             } catch (SAXException sae) {
              sae.printStackTrace();
             }
      

      注意:你需要添加 followinf 导入 -

      import java.io.File;
      import java.io.IOException;
      import javax.xml.parsers.DocumentBuilder;
      import javax.xml.parsers.DocumentBuilderFactory;
      import javax.xml.parsers.ParserConfigurationException;
      import javax.xml.transform.Transformer;
      import javax.xml.transform.TransformerException;
      import javax.xml.transform.TransformerFactory;
      import javax.xml.transform.dom.DOMSource;
      import javax.xml.transform.stream.StreamResult;
      import org.w3c.dom.Document;
      import org.w3c.dom.Element;
      import org.w3c.dom.NamedNodeMap;
      import org.w3c.dom.Node;
      import org.w3c.dom.NodeList;
      import org.xml.sax.SAXException;
      
      }
      

      编辑 - 此代码仅重写您的 xml 文件,您需要在此之后以编程方式执行您编辑的文件以执行最终的 xml,例如 this。

      【讨论】:

      • 不行,测试方法也要声明这个参数。
      • @RocketRaccoon 抱歉,没有引起您的关注,能否详细说明一下?
      • 您的代码只是用附加节点修改 xml。测试方法还应该包括这些参数,如果这些参数仅针对 xml 中的一个测试标签声明,则相同的测试方法应该在从另一个测试标签执行时以某种方式处理它们。所以在 xml 中添加参数只是解决方案的一部分。
      • @RocketRaccoon 哦,是的。我已经编辑了答案。此解决方案只是重写现有的 xml 文件。
      猜你喜欢
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多