TestNG:从Maven传递参数到DataProvider

时间:2016-08-08 16:18:56

标签: java maven testng testng-dataprovider

我似乎尝试了所有可能的方法来实现这一点,但没有运气。我在DataProvider中有一个复杂的代码(它确实以复杂的方式收集数据),我想最终通过CI进行参数化。

这里的第一个问题是如何在DataProvider中甚至读取参数。

1一种方法是以这种方式从testng.xml获取参数:

    String lolo = context.getCurrentXmlTest().getParameter("testcases");

但这并没有解决问题,因为.xml文件必须是静态的,我想从Maven传递参数。

2另一种方法是在我的案例中从@Factory读取参数:

    String testCaseDataFilename = (method.getAnnotation(Factory.class)).parameters()[0];

@Factory在哪里:

    @Factory(dataProvider="dataProviderMethod", parameters = {"authentication-testcases.json"})

它也有效,但同样没有解决问题,因为现在必须在java测试文件中对参数进行编码,而@Factory自身使用@DataProvider,并且它无法隐式地从Maven接收参数。 / p>

此外,我还有其他测试参数,这些参数由Maven传递,但它们仅用于@Test测试,而不是DataProvider,而@BeforeSuite成功接收它们。

我会尽量简化:

我正在打电话给maven

-Dtestname=signUp -Dmyparam=1 test

我希望我的DataProvider接收Dmyparam的这个值并用它来收集数据。我所获得的只是使用@BeforeSuite接收这些数据并将其设置为全局,但问题是DataProvider在设置数据之前被称为

2 个答案:

答案 0 :(得分:2)

-D正在设置系统属性。

您可以使用System.getProperty("MyParam")在代码中获取它。

答案 1 :(得分:0)

  

我所获得的只是通过@BeforeSuite接收这些数据并将其全局设置,但问题是DataProvider在设置数据之前被称为

我无法证实这一点。

如果您能够在测试类中声明DataProvider,您可以让TestNG将套件参数注入@BeforeSuite方法,然后将值存储为实例字段:

public class Testcase3 {

    String foo;
    String bar;
    String baz;

    // Runs before the dataprovider
    @BeforeSuite
    // Injected from suite.xml and VM arguments
    @Parameters({"foo", "bar", "baz"})
    public void init(String foo, String bar, String baz) {
        this.foo = foo;
        this.bar = bar;
        this.baz = baz;
    }

    @DataProvider(name="foodp")
    public Object[][] foodp(){
        return new Object[][] {
            new String[] { "1: " + foo, "2: " + bar, "3: " + baz }
        };
    }

    // Injected from the data provider
    @Test(dataProvider="foodp")
    public void testFoo(String str1, String str2, String str3) {
        System.out.println("# test: str1=" + str1);
        System.out.println("# test: str2=" + str2);
        System.out.println("# test: str3=" + str3);
    }

}

使用此suite.xml和VM参数-Dbaz=buzz

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="defaultsuite">
    <parameter name="foo" value="moo" />
    <parameter name="bar" value="far" />
    <test name="alltests">
        <classes>
            <class name="testng.tests.Testcase3"></class>
        </classes>
    </test>
</suite>

打印:

# test: str1=1: moo
# test: str2=2: far
# test: str3=3: buzz

您还可以让TestNG将参数注入工厂:

public class TestFactory {

    @Factory
    @Parameters({"foo", "bar", "baz"})
    public Object[] createTestInstances(String foo, String bar, String baz) {
        Object[] testcases = new Object[1];

        testcases[0] = new Testcase4();
        ((Testcase4) testcases[0]).initDataProvider(foo, bar, baz);

        return testcases;
    }

}

您的测试可以通过这种方式接收数据:

public class Testcase4 {

    String foo;
    String bar;
    String baz;

    public void initDataProvider(String foo, String bar, String baz) {
        this.foo = foo;
        this.bar = bar;
        this.baz = baz;
    }

    // ...
}

至少从TestNG 6.9.10和更新版本起作用。