从属性文件导入值以进行自动化测试

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次。第一个参数为 Peter18,第二个参数为 Ross45,依此类推。

这就是 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");

为什么不是你的情况?

您有一个 属性 文件,其中您的 属性 有一个值。这不是数据提供者的模式。最好直接从测试中轮询 属性 值。