从属性文件导入值以进行自动化测试
Importing Values from a Properties File for Automation Testing
我必须编写一个测试,该测试可以使用 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
.[=29 的 @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
方法,必须定义2个参数,将执行3次。第一个参数为 Peter
和 18
,第二个参数为 Ross
和 45
,依此类推。
这就是 DataProvider
的工作原理。因此,您将不得不手动解析 properties
文件,并使用 ots 内容构建 Object[][]
来为 @Test
方法提供服务。
所以你的 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[][]
。
尽管您标记为正确的答案解决了您的特定问题,但我想提供一些见解,因为我认为您误解了数据提供者的概念。
为什么会 return Object[][]
?
数据提供者是一种机制,它允许将单个测试相乘,以便拥有该单个测试和 N
条输入数据,您将拥有 N
个测试。
这就是Object[][]
的由来。基本上 Object[][]
是一个 Object[]
的数组,其中“外部数组”包含用于不同测试的参数序列,每个序列由“内部数组”表示。
例如你有一个方法:
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");
为什么不是你的情况?
您有一个 属性 文件,其中您的 属性 有一个值。这不是数据提供者的模式。最好直接从测试中轮询 属性 值。
我必须编写一个测试,该测试可以使用 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
.[=29 的 @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
方法,必须定义2个参数,将执行3次。第一个参数为 Peter
和 18
,第二个参数为 Ross
和 45
,依此类推。
这就是 DataProvider
的工作原理。因此,您将不得不手动解析 properties
文件,并使用 ots 内容构建 Object[][]
来为 @Test
方法提供服务。
所以你的 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[][]
。
尽管您标记为正确的答案解决了您的特定问题,但我想提供一些见解,因为我认为您误解了数据提供者的概念。
为什么会 return Object[][]
?
数据提供者是一种机制,它允许将单个测试相乘,以便拥有该单个测试和 N
条输入数据,您将拥有 N
个测试。
这就是Object[][]
的由来。基本上 Object[][]
是一个 Object[]
的数组,其中“外部数组”包含用于不同测试的参数序列,每个序列由“内部数组”表示。
例如你有一个方法:
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");
为什么不是你的情况?
您有一个 属性 文件,其中您的 属性 有一个值。这不是数据提供者的模式。最好直接从测试中轮询 属性 值。