TestNG DataProvider从testng.xml配置文件中读取测试数据?

5
有没有可能让TestNG DataProvider从testng.xml配置文件中读取测试数据?还是由于某些原因这是不现实的?我想能够在套件级别和类级别从那个文件中读取测试数据。
所以,假设有一个像这样的testing.xml文件(我不确定是否现实),我该如何做呢?我以前使用过XStream(或Jackson)编写DataProvider,因此我很熟悉自己的自定义.xml格式,但是严格遵守testing.xml的格式却让我感到担忧。
以下testing.xml明显无效,但我只是想展示我想做的事情的类型:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 
<suite name="TestAll"> 
  <parameter name="hubUrl" value="http://localhost:4444/wd/hub"/>
  <parameter name="reportFile" value="CustomReport.html"/>
  <test name="etsy">
    <parameter name="reportFile" value="CustomReport.html"/>
    <classes>
      <class name="qa.examples.suite.TestSearch">
        <parameter name="appUrl"  value="http://etsy.com" type="java.lang.String"/> 
        <parameter name="browser"  value="Firefox" type="java.lang.String"/>    
        <parameter name="testEnabled" value="true" type="java.lang.Boolean"/> 
        <methods>                 
          <include name="testEtsySearch"/>
            <tests>
              <test>
                <parameter name="testNum" value="1" type="java.lang.Integer"/>
                <parameter name="searchTerm" value="cell phone" type="java.lang.String"/>
                <parameter name="searchTerm" value="batteries" type="java.lang.String"/>
              </test>
              <test>
                <parameter name="testNum" value="2" type="java.lang.Integer"/>
                <parameter name="searchTerm" value="buttons" type="java.lang.String"/>
                <parameter name="searchTerm" value="metal" type="java.lang.String"/>
              </test>
            </tests>
          </include>                       
        </methods> 
      </class>
      <class name="qa.examples.suite.TestFilters" />
    </classes>
    </test> 
</suite>

那么,这种情况是否可能呢?如果可以,应该如何实现?
2个回答

9
尝试将ITestContext作为数据提供者参数传递。 类似于以下内容:
@DataProvider(name = "DataProvider")
public static Object[][] Provider(ITestContext context) throws Exception
{
    String dataFile = context.getCurrentXmlTest().getParameter("dataFile");
}

套件 XML

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 
<suite name="suite"> 
  <parameter name="param1" value="val1"/>
  <test name="test">
    <parameter name="param2" value="val2"/>
    <classes>
      <class name="test.TestClass1" />
    </classes>
  </test> 
</suite>

测试类

package test;
import java.util.Map;
import org.testng.ITestContext;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestClass1 {

@DataProvider(name="Provider")
public Object[][] provider(ITestContext context)
{
 Map<String, String> testParams = context.getCurrentXmlTest().getLocalParameters();
 Map<String, String> suiteParams=context.getCurrentXmlTest().getSuite().getParameters();

 return new Object[][]{{suiteParams.get("param1"), testParams.get("param2")}};
}

@Test(dataProvider="Provider")
public void test1(String param1, String param2)
{
 System.out.println("Param1: " + param1);
 System.out.println("Param2: " + param2);
}

}

输出

[TestNG] Running:
/home/nightmare/workspace/test/suite.xml

Param1: val1
Param2: val2

===============================================
suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================

你确定那样做能行吗?根据我的经验,数据提供器方法在套件之前运行(因为保留设置为运行时),所以它怎么可能知道单个测试的上下文呢?直到测试运行时,这些上下文才会被了解:我错了吗? - djangofan
一旦我意识到TestNG中的所有配置方法都可以接受某种上下文参数,一个全新的世界为我展开。谢谢! - djangofan

0
我目前只从我的XML传递套件级参数。这是我会这样做的 - 我会创建一个类 - readParamsFromXML。
@Parameters( { "suiteParam1", "suiteParam2" } )
@BeforeSuite
public void getSuiteLevelParamsFromXML(
    @Optional("defaultValueForSuiteParam1")String SuiteParam1, 
    @Optional("defaultValueForSuiteParam2")String SuiteParam2 ) {
     <Some  Logic here based on the params passed>
}

我会采用类似的逻辑来读取测试级别和方法级别的参数,通过创建像 getTestLevelParamsFromXML 和 getMethodLevelParamsFromXML 这样的方法。我会分别为上述方法添加注释 @BeforeClass 和 @BeforeMethod。

现在,所有的测试用例都应该扩展 readParamsFromXML 类。这样,从 XML 传递的套件、测试和类级别的参数就可以在测试方法中使用了。

可能不是最好的解决方案,但对我来说完美地解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接