首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以将参数传递给TestNG DataProvider?

是否可以将参数传递给TestNG DataProvider?
EN

Stack Overflow用户
提问于 2009-03-20 14:53:29
回答 5查看 56.1K关注 0票数 26

我们想要针对一组数据值运行一些测试,验证相同的条件是否适用于每个数据值。数据当前存储在平面文件或简单的Excel电子表格中。

我的第一个想法是创建一个TestNG DataProvider,它将从文件中加载数据,并用于为每个数据值调用一次测试方法。我的问题是,不同的测试需要从不同的文件加载数据,而且似乎没有任何方法可以将参数发送到DataProvider。有人知道这是否可能吗?

理想情况下,我希望我的代码看起来像下面这样(简化示例):

代码语言:javascript
复制
public class OddTest {
    @DataProvider(name = "excelLoader")
    public Iterator<Object[]> loadExcelData(String fileName) {
        ...
    }

    @Test(dataProvider = "excelLoader" dataProviderParameters = { "data.xls" })
    public void checkIsOddWorks(int num)
        assertTrue(isOdd(num));
    }
}
EN

回答 5

Stack Overflow用户

发布于 2009-08-12 20:48:15

摘自the TestNG docs

如果您将@DataProvider声明为接受java.lang.reflect.Method作为第一个参数,则TestNG将传递此第一个参数的当前测试方法。当几个测试方法使用相同的@DataProvider,并且您希望它根据为哪个测试方法提供数据而返回不同的值时,这特别有用。

例如,下面的代码在其@DataProvider中打印测试方法的名称:

代码语言:javascript
复制
@DataProvider(name = "dp")
public Object[][] createData(Method m) {
  System.out.println(m.getName());  // print test method name
  return new Object[][] { new Object[] { "Cedric" }};
}

@Test(dataProvider = "dp")
  public void test1(String s) {
}

@Test(dataProvider = "dp")
  public void test2(String s) {
}

因此将显示以下内容:

代码语言:javascript
复制
test1
test2

这也可以与desolat提供的解决方案相结合,从而根据上下文和方法确定数据:

代码语言:javascript
复制
    @DataProvider(name = "dp")
    public Object[][] foodp(ITestContext ctx, Method method) {
        // ...
    }
票数 21
EN

Stack Overflow用户

发布于 2011-01-17 23:56:39

您可以使用TestNG's dependency injection capabilies访问DataProvider中的所有已定义参数。这是一些需要"test_param“参数的DataProvider示例:

代码语言:javascript
复制
@DataProvider(name = "usesParameter")
public Object[][] provideTestParam(ITestContext context) {
    String testParam = context.getCurrentXmlTest().getParameter("test_param");
    return new Object[][] {{ testParam }};
}

这需要在suite.xml中定义"test_param“

代码语言:javascript
复制
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="suite">
    <parameter name="test_param" value="foo" />
    <test name="tests">
        <classes>
            ...
        </classes>
    </test>
</suite>

有关ITestContext类的详细信息,请参阅TestNG JavaDoc

票数 18
EN

Stack Overflow用户

发布于 2016-01-30 08:31:53

一种更通用的方法是使用groups注释来构建自定义值列表:

代码语言:javascript
复制
@DataProvider(name = "excelLoader")
public Object[][] createData(Method m) {
    ArrayList<Object[]> excelFiles = new ArrayList<Object[]>;
    // iterate over all the groups listed in the annotation
    for (String excelFile : ((Test) m.getAnnotation(Test.class)).groups()) {
        // add each to the list
        excelFiles.add(new Object[] { excelFile });
    }
    // convert the list to an array
    return excelFiles.toArray(new Object[excelFiles.size()]);
}

@Test(dataProvider = "excelLoader", groups = { "data1", "data2" })
public void test1(String excelFile) {
    // we will test "data1.xls" and "data2.xls" in this test
    String testExcelFile = excelFile + ".xls";
}

@Test(dataProvider = "excelLoader", groups = { "data2", "data3" })
public void test2(String excelFile) {
    // we will test "data2.xls" and "data3.xls" in this test
    String testExcelFile = excelFile + ".xls";
}

或者,您也可以创建自己的注释类,该类接受自定义元素,这样您就可以做更多的事情,例如:

代码语言:javascript
复制
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({METHOD, TYPE, CONSTRUCTOR})
public @interface FilesToTest {
    public String[] value() default {};
}

@DataProvider(name = "excelLoader")
public Object[][] createData(Method m) {
    ArrayList<Object[]> excelFiles = new ArrayList<Object[]>;
    // iterate over all the groups listed in the annotation
    for (String excelFile : ((FilesToTest) m.getAnnotation(FilesToTest.class)).value()) {
        // add each to the list
        excelFiles.add(new Object[] { excelFile });
    }
    // convert the list to an array
    return excelFiles.toArray(new Object[excelFiles.size()]);
}

@Test(dataProvider = "excelLoader")
@FilesToTest({ "data1.xls", "data2.xls" })
public void myTest(String excelFile) {
    // we will test "data1.xls" and "data2.xls" in this test
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/666477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档