如何在@BeforeSuite中使用testNG @Parameters来读取资源文件

时间:2012-05-18 11:22:55

标签: java testng

我将testNGSelenium webdriver2.0一起使用。

testNG.xml我有

<suite data-provider-thread-count="2" name="selenium FrontEnd Test" parallel="false" skipfailedinvocationCounts="false" thread-count="2">
  <parameter name="config_file" value="src/test/resources/config.properties/"/>
  <test annotations="JDK" junit="false" name="CarInsurance Sanity Test" skipfailedinvocationCounts="false" verbose="2">
    <parameter name="config-file" value="src/test/resources/config.properties/"/>
    <groups>
      <run>
        <include name="abstract"/>
        <include name="Sanity"/>
      </run>
    </groups>
    <classes>
    </classes>
  </test> 
</suite>

在java文件中

@BeforeSuite(groups = { "abstract" } )
@Parameters(value = { "config-file" })
public void initFramework(String configfile) throws Exception 
{
    Reporter.log("Invoked init Method \n",true);

    Properties p = new Properties();
    FileInputStream  conf = new FileInputStream(configfile);
    p.load(conf);

    siteurl = p.getProperty("BASEURL");
    browser = p.getProperty("BROWSER");
    browserloc = p.getProperty("BROWSERLOC");

}

将错误视为

  

AILED CONFIGURATION:@BeforeSuite initFramework   org.testng.TestNGException:   方法initFramework上的@Configuration需要参数'config-file'   但尚未标记为@Optional或在

中定义

如何将@Parameters用于资源文件?

2 个答案:

答案 0 :(得分:9)

您的config-file参数似乎未在<suite>级别定义。有几种方法可以解决这个问题: 1.确保<parameter>元素在<suite>标记内定义,但在任何<test>之外:

 <suite name="Suite1" >
   <parameter name="config-file" value="src/test/resources/config.properties/" />
   <test name="Test1" >
      <!-- not here -->
   </test>
 </suite>

2。如果您希望在Java代码中具有参数的默认值,尽管它是在testng.xml中指定的,您可以在方法参数中添加@Optional注释:

@BeforeSuite
@Parameters( {"config-file"} )
public void initFramework(@Optional("src/test/resources/config.properties/") String configfile) {
    //method implementation here
}

编辑(基于发布的testng.xml):

选项1:

<suite>
  <parameter name="config-file" value="src/test/resources/config.properties/"/>
  <test >
    <groups>
      <run>
        <include name="abstract"/>
        <include name="Sanity"/>
      </run>
    </groups>
    <classes>
      <!--put classes here -->
    </classes>
  </test> 
</suite>

选项2:

@BeforeTest
@Parameters( {"config-file"} )
public void initFramework(@Optional("src/test/resources/config.properties/") String configfile) {
    //method implementation here
}

在任何情况下,我都建议不要让两个参数具有几乎相同的名称,相同的值和不同的范围。

答案 1 :(得分:1)

您想在@Parameter中使用@BeforeSuite。套件开始执行后会解析套件级参数,我相信即使在处理套件之前,TestNG也会调用@BeforeSuite

这是一种解决方法:在方法参数中添加ITestContext以注入

@BeforeSuite(groups = { "abstract" } )
@Parameters({ "configFile" })
public void initFramework(ITestContext context, String configFile) throws Exception {