2014-01-22 68 views
3

TestNG DataProvider是否可以从testng.xml配置文件中读取测试数据?或者出于某种原因这是不现实的?我希望能够从套件级别和课堂级别读取该文件中的测试数据。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> 

那么,这样的事情可能吗?如果是这样,你会怎么做?

回答

8

尝试通过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 
=============================================== 
+0

你确定这样吗?根据我的经验,数据提供者方法在套件之前运行(因为保留设置为运行时),因此如何才能知道单个测试的上下文?这些上下文在测试运行之前是未知的:我错了吗? – djangofan

+1

@djangofan查看已更新的答案 – user1058106

+0

一旦我意识到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> 
} 

我将延长一个类似的逻辑通过创建类似的方法,在测试一级阅读PARAMS &方法级别 - getTestLevelParamsFromXML & getMethodLevelParamsFromXML。对于上述方法,我会分别添加注释@BeforeClass & @BeforeMethod。

现在,我所有的测试用例都应该扩展readParamsFromXML类。这种方式 - 套件,测试&从XML传递的类级别参数可能在测试方法中可用

可能不是完成任务的最佳方式。但对我来说完美的作品。

相关问题