从Excel读取以提供测试用例

时间:2014-04-29 18:38:16

标签: java selenium arraylist selenium-webdriver testng

我有一个ExcelReader类,它从Excel中读取并填充相应的列表。

public static List<Address> addressList;
public static List<User> userList;

以上列表由ExcelReader填充:

addressList = new ArrayList<Address>();
Address a = new Address();
a.setAddress1(r.getCell(0).getStringCellValue());
a.setCity(r.getCell(1).getStringCellValue());

我想在我的Selenium测试用例中使用这些数据。我打算使用TestNG的@DataProvider标记来提供测试用例,但它只接受Object [] []和Iterator。

有没有办法将这些列表转换为Object [] []格式?

如果您更喜欢使用@DataProvider以外的任何其他内容,我也愿意接受任何建议。

提前致谢

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,但这是一个想法。 I wrote an example here就是这样做的。

这个想法的一般要点是,使用MetaModel api

public static Object[][] get2ArgArrayFromRows( List<Row> rows ) {
    Object[][] myArray = new Object[rows.size()][2];
    int i = 0;
    SelectItem[] cols = rows.get(0).getSelectItems();
    for ( Row r : rows ) {
        Object[] data = r.getValues();
        for ( int j = 0; j < cols.length; j++ ) {
            if ( data[j] == null ) data[j] = ""; // force empty string where there are NULL values
        }
        myArray[i][0] = cols;
        myArray[i][1] = data;
        i++;
    }
    logger.info( "Row count: " + rows.size() );
    logger.info( "Column names: " + Arrays.toString( cols ) );
    return myArray;
}

public static Object[][] getCsvData( File csvFile ) 
{   
    CsvConfiguration conf = new CsvConfiguration( 1 );
    DataContext csvContext = DataContextFactory.createCsvDataContext( csvFile, conf );
    Schema schema = csvContext.getDefaultSchema();
    Table[] tables = schema.getTables();
    Table table = tables[0]; // a representation of the csv file name including extension
    DataSet dataSet = csvContext.query()
            .from( table )
            .selectAll()
            .where("run").eq("Y")
            .execute();
    List<Row> rows = dataSet.toRows();
    Object[][] myArray = get2ArgArrayFromRows( rows );
    return myArray;
}

现在,上面的代码只是一个粗略的想法。您真正需要做的是将cols和数据合并到Map<String,String>对象中,然后将其作为第一个参数传递回测试,其中包含CSV文件中的所有参数,包括浏览器类型。然后,作为第二个参数,设置如下:

myArray[i][1] = new WebDriverBuilderHelper();

然后,在@Test带注释的方法中,实例化驱动程序:

@Test(dataProvider = "dp") 
public void testIt( Map<String,String> map, WebDriverBuilderHelper wdhelper ) {
    wdhelper.instantiateBrowser( map.get("browser") );
    wdhelper.navigateTo(url);
    ....