我必须编写一个测试,该测试可以使用TestNG中的数据提供程序从属性文件打印值。我不确定从哪里开始。我已经使用硬编码值完成了任务,但无法使用该文件来完成。以下是我目前所拥有的:
public class ConfigurationProvider {
@DataProvider(name = "browserProvider")
public FileInputStream getFile() throws IOException {
FileInputStream fis = new FileInputStream(
"C:\Users\user\git\practice\automation\src\test\resources\config.properties");
Properties p = new Properties();
p.load(fis);
p.getProperty("BrowserType");
return fis;
}
@Test(dataProvider = "browserProvider")
public void canPrintBrowser(String browserType) {
System.out.println("The browser type is: " + browserType);
}
}
属性文件如下所示:
Url=http://the-internet.herokuapp.com
BrowserType=chrome
ImplicitTimeout=5000
ScriptTimeout=5000
运行测试失败,因为它希望我使用Object[][]
。但我不确定如何适应它。到目前为止,我所做的所有研究都只是使用网络驱动程序等过于复杂的东西……这应该是基本的,但我是新手,这真的很折磨我的大脑。
DataProvider
需要一个Object[][]
,因为它将是二维数组,具有使用该DataProvider
的@Test
的所有执行的参数。
例如,如果返回的Object[][]
是这样的:
data[0][0] = "Peter";
data[0][1] = "18";
data[1][0] = "Ross";
data[1][1] = "45";
data[2][0] = "Diana";
data[2][1] = "11";
@Test
方法将被执行3次,然后必须用2个参数来定义。第一个具有参数Peter
和18
,第二个具有Ross
和45
,依此类推
DataProvider
就是这样工作的。因此,您必须手动解析properties
文件,并使用ots内容构建将为@Test
方法提供服务的Object[][]
。
因此,你的DataProvider
方法,就像你的问题中一样,简单地针对单个样本,应该是这样的:
@DataProvider(name = "browserProvider")
public Object[][] getData() throws IOException {
FileInputStream fis = new FileInputStream(
"C:\Users\user\git\Quntrix-Training\automation\src\test\resources\config.properties");
Properties p = new Properties();
p.load(fis);
Object[][] data = new Object[1][1];
data[0][0] = p.getProperty("BrowserType");
return data;
}
如果properties
中有更多的数据,只需根据需要进行迭代或检索,并不断填充Object[][]
。
尽管您标记为正确的答案解决了您的特定问题,但我想提供一些见解,因为我认为您误解了数据提供商的概念。
为什么返回Object[][]
数据提供程序是一种允许将单个测试相乘的机制,这样,如果有了该单个测试和N
条输入数据,就可以进行N
测试。
这就是Object[][]
的来源。基本上CCD_ 23是CCD_;外部阵列";保持用于不同测试的参数序列,并且每个序列由"0"表示;内部阵列";。
例如,您有一种方法:
public void testMyStuff(String a, String b){
...
}
此方法采用两个参数,因此;"水平";Object[][]
的大小将是2。
现在,如果你想把这个单独的测试分成三个不同的测试,你需要有";垂直的";Object[][]
的大小等于3。
Object[][] test = {
{"A1", "B1"},
{"A2", "B2"},
{"A3", "B3"}
};
因此,您将拥有以下执行序列:
testMyStuff("A1", "B1");
testMyStuff("A2", "B2");
testMyStuff("A3", "B3");
那为什么不是你的情况呢
您有一个属性文件,其中您的属性有一个值。这不是数据提供者的模式。最好直接从测试中轮询属性值。