使用Data Provider读取Excel(Map格式):按测试名过滤数据并解决null行问题
解决Excel Data Provider过滤后返回null行的问题
首先,你的代码当前会返回包含null的数组,核心问题是你预先按总行数初始化了数组,但只有匹配的行才会赋值,不匹配的位置自然留空成null。另外还有个隐藏坑:如果datamap是在循环外声明的,所有行都会复用同一个Map实例,最终所有元素都会是最后一次赋值的内容。
下面是修正后的代码,一次性解决这两个问题:
String m1 = m.getName(); int lastRowNum = sheet.getLastRowNum(); int lastCellNum = sheet.getRow(0).getLastCellNum(); // 先收集所有匹配的数据,避免出现null占位 List<Map<String, String>> matchedData = new ArrayList<>(); for (int i = 0; i < lastRowNum; i++) { Row row = sheet.getRow(i + 1); if (row == null) continue; // 跳过Excel里的空行 Cell testNameCell = row.getCell(0); String tn = testNameCell == null ? "" : testNameCell.toString(); if (m1.equalsIgnoreCase(tn)) { // 每次循环新建Map,确保每行数据独立不覆盖 Map<String, String> dataMap = new HashMap<>(); for (int j = 0; j < lastCellNum; j++) { Cell headerCell = sheet.getRow(0).getCell(j); Cell valueCell = row.getCell(j); // 处理空单元格的情况,避免空指针 String header = headerCell == null ? "" : headerCell.toString(); String value = valueCell == null ? "" : valueCell.toString(); dataMap.put(header, value); } matchedData.add(dataMap); } } // 把收集到的有效数据转成Data Provider需要的Object[][]格式 Object[][] obj = new Object[matchedData.size()][1]; for (int k = 0; k < matchedData.size(); k++) { obj[k][0] = matchedData.get(k); } return obj;
关键改进点:
- 用List先收集有效数据:不再提前创建固定大小的数组,而是先把符合条件的行数据存到List里,最后再转成目标格式,返回的数组里就不会有多余的null了。
- 每次循环新建Map实例:确保每一行的Map都是独立的,不会出现后续行覆盖前面行数据的问题。
- 增加空值防护:处理Excel中可能存在的空行、空单元格,避免出现NullPointerException。
这样修改后,你的Data Provider就只会返回过滤后的有效测试数据啦。
内容的提问来源于stack exchange,提问作者Beaula
相关产品推荐
相关产品推荐

