【问题标题】:How to pass bean class to a test method in testng?如何将bean类传递给testng中的测试方法?
【发布时间】:2019-03-18 05:37:48
【问题描述】:

我有一个 Excel Util,它可以从 Excel 表中读取所有数据。 excel 表有 10 列,例如 time、sourceType、tid、message、severity、 lastModify、entityName、operationType、replayId、recordIds。

我的 DataProvider 有类似这样的代码,它返回所有 10 列及其值。

@DataProvider(name="googleData")
public static Object[][] testData() {
    String filePath = "/Users/TestUser/Workspace/FixProject/ExcelCheck/src/test/resources/excelreader.xlsx";
    Object[][] arrayObject = excelFileUtils.getExcelData(filePath, "excelreader");
    return arrayObject;
}

在我的测试方法中,我必须通过所有这 10 列,否则它不会让我运行。相反,我想创建一个 Bean 类并将这样的内容传递给我的测试方法

@Test(dataProvider = "googleData", dataProviderClass = DataProviders.class)
public void testGoogleData(BeanClass object) {
System.out.println(object.getTid());

}

我们如何做到这一点?

【问题讨论】:

    标签: selenium selenium-webdriver testng dataprovider testng-dataprovider


    【解决方案1】:

    使用您拥有的 dataProvider,您的测试方法将为数组中的每个对象运行 10 次。

    您可以做的是创建一个对象,将您的 dataProvider 转换为该对象,然后使用您的测试方法代码。

    Object myDataHelper = null;
    
    @Test()
    public void testGoogleData(BeanClass object) {
    myDataHelper = convertDataProviderToObject();
    // use it here in a for/for each loop
    System.out.println(object.getTid());
    }
    

    【讨论】:

    • 对于您的方法,在测试注释中我们没有通过数据提供者。我想将我的数据提供者传递给 Excel 工作表。 excel 工作表返回一个二维对象,其中包含我的 excel 工作表中的所有 10 列。此外,我想将所有这 10 列映射到一个 bean 类 Object,它应该再次返回一个 2-D 对象(因为数据提供程序允许 Object[][] 作为返回类型)。
    • 当您使用 dataProvider 时 - 二维数组中的每个项目都会调用它。您必须欺骗系统并使用另一个对象来遍历数组中的每个元素。这就是 dataProvider 使用 TestNG 的工作方式。
    【解决方案2】:
    public static Object[][] read_excel(String Sheet_Name) throws Exception
        {
            File obj = new File("./src/main/java/com/Demo/TestData/Test_Data.xlsx");
            FileInputStream fis = new FileInputStream(obj);
            XSSFWorkbook wb = new XSSFWorkbook(fis);
            XSSFSheet sheet = wb.getSheet(Sheet_Name);
            int row_number  = sheet.getLastRowNum();
            int column_number = sheet.getRow(0).getLastCellNum();
            Object data[][] = new Object[row_number][column_number];
            wb.close();
            for(int i=0; i<row_number; i++)
            {
                for(int j=0; j<column_number; j++)
                {
                    data[i][j] = sheet.getRow(i + 1).getCell(j).toString();
                }
            }
            return data;
        }   
    

    @DataProvider
    public Object[][] getDataFromExcel() throws Exception
    {  Object[][] data = Utility.read_excel("Admin_Credentials");//Sheet name
        return data;
    } 
    @Test(dataProvider="getDataFromExcel")
    

    【讨论】:

    • 我有相同的代码。问题是它需要将所有列传递给我的测试方法。我不能使用 Bean 类并按照它所说的那样调用它,你有 10 个来自数据提供者的对象,而测试只调用了 1 个对象。
    【解决方案3】:

    QAF-TestNG extension 支持。在使用内置或自定义数据提供程序时,您可以在测试方法中使用 one or more complex object 参数。对于 excel,您的代码可能如下所示:

    @QAFDataProvider(dataFile = "resources/data/googletestdata.xls")
    @Test
    public void testGoogleData(BeanClass object) {
       System.out.println(object.getTid());
    }
    

    对于自定义数据提供者,它可能如下所示:

    @QAFDataProvider
    @Test(dataProvider = "googleData", dataProviderClass = DataProviders.class)
    public void testGoogleData(BeanClass object) {
       System.out.println(object.getTid());
    }
    

    您需要确保 bean 类中的属性名称必须与列名称匹配(以任何顺序)。使用自定义数据提供者时,您需要为 ListMap&lt;String, Object&gt; 或具有 Map 的 Object[][] 返回 Iterator,如果您需要创建自定义数据提供者,请参考 few example

    【讨论】:

    • 它不适用于方法 1。你能试着让我知道吗?我收到一个错误,“数据提供者正在尝试传递 3 个方法,但方法 testGoogleData 需要 1 个。Excel 表有 3 列名称、tid、电子邮件和 1 行。我还创建了具有这 3 个成员和各自的 BeanClass getter 和 setter。
    • 可能你没有使用 qaf 2.1.14。 qaf-example-project 是工作示例,您可以尝试参考。
    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    相关资源
    最近更新 更多