我正在使用TestNG创建一个测试用例,该测试用例使用DataProvider将数据提供给Factory,该工厂用于测试用例类的构造函数以在类中设置变量。我将我的DataProvider放在一个单独的类中用于模块化(因为我期望我的测试用例数量相当大,我需要重用DataProviders。示例如下所示:
包含DataProvider的类:
public class DP {
@DataProvider(name="testData")
public Object[][] testData() {
return new Object[][] {
{ "tc1", "1" },
{ "tc2", "2" },
{ "tc3", "3" }
};
}
}
包含测试用例的类:
public class SampleTestCase {
String[] params;
@Factory(dataProviderClass=DP.class, dataProvider="testData")
public SampleTestCase(String[] params) {
System.out.println("Constructor...");
for(String s : params)
System.out.println(s);
this.params = params;
}
@Test
public void tc1() {
System.out.println("tc1...");
for(String s : params)
System.out.println(s);
}
@Test(dependsOnMethods="tc1")
public void tc2() {
System.out.println("tc2...");
for(String s : params)
System.out.println(s);
}
}
当我尝试运行此操作时,出现以下错误:
org.testng.TestNGException:工厂方法类 com.company.automation.regression.SampleTestCase.com.company.automation.regression.SampleTestCase() 抛出一个例外 org.testng.internal.FactoryMethod.invoke(FactoryMethod.java:121)at org.testng.internal.TestNGClassFinder。(TestNGClassFinder.java:153) 在 org.testng.internal.TestNGClassFinder。(TestNGClassFinder.java:40) 在org.testng.TestRunner.initMethods(TestRunner.java:403)at org.testng.TestRunner.init(TestRunner.java:252)at org.testng.TestRunner.init(TestRunner.java:222)at org.testng.TestRunner。(TestRunner.java:171)at org.testng.remote.support.RemoteTestNG6_10 $ 1.newTestRunner(RemoteTestNG6_10.java:28) 在 org.testng.remote.support.RemoteTestNG6_10 $ DelegatingTestRunnerFactory.newTestRunner(RemoteTestNG6_10.java:61) 在 org.testng.SuiteRunner $ ProxyTestRunnerFactory.newTestRunner(SuiteRunner.java:623) 在org.testng.SuiteRunner.init(SuiteRunner.java:189)at org.testng.SuiteRunner。(SuiteRunner.java:136)at org.testng.TestNG.createSuiteRunner(TestNG.java:1375)at at org.testng.TestNG.createSuiteRunners(TestNG.java:1355)at at org.testng.TestNG.runSuitesLocally(TestNG.java:1209)at at org.testng.TestNG.runSuites(TestNG.java:1133)at org.testng.TestNG.run(TestNG.java:1104)at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114) 在org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) 在org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)引起 by:org.testng.TestNGException:无法实例化类 com.company.automation.regression.SampleTestCase at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:40) at org.testng.internal.FactoryMethod.invoke(FactoryMethod.java:107) ... 19更多引起:java.lang.IllegalArgumentException:错误 参数的数量 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) at sun.reflect.NativeConstructorAccessorImpl.newInstance(未知 来源)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知 来自java.lang.reflect.Constructor.newInstance(未知来源) 在 org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:29) ......还有20个
如果我将SampleTestCase
的构造函数的参数从String[] params
更改为String p1, String p2
,那么它可以正常工作。我唯一的问题是我的DataProvider中有大量的参数(即10个以上的参数)。我计划将其加载到哈希映射中,一旦我能够正常工作......
提前谢谢!
答案 0 :(得分:0)
要避免错误,请创建类型为String[]
的对象:
public class DP {
@DataProvider(name="testData")
public static Object[][] testData() {
return new Object[][] {
{ new String[] {"tc1", "1" }},
{ new String[] {"tc2", "2" }},
{ new String[] {"tc3", "3" }}
};
}
}
Object[][]
数组的两个外部维度由TestNG“解包”(第一个维度定义单独的调用,第二个维度定义要传递给测试/工厂方法的单独参数)。要接收数组作为参数,应将其视为任何其他Object
并在此二维结构中“包装”。