我似乎尝试了所有可能的方法来实现这一点,但没有运气。我在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在设置数据之前被称为 。
答案 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和更新版本起作用。