使用TestNG @DataProvider读取Excel时程序无限运行问题求助
问题解决:TestNG @DataProvider 无限运行排查与修复
核心问题:无限循环的根源
你的代码里的while循环没有对变量i进行递增操作,导致永远停留在第0行,无法推进循环,进而触发无限运行。
修复步骤及优化点
1. 修复循环递增逻辑
在循环体内最后添加i++,让循环能逐行读取数据:
while (!Objects.equals(s, "0")) { XSSFRow row = sheet.getRow(i); // ... 原有读取单元格逻辑 data[i][0] = val1; data[i][1] = val2; i++; // 必须添加这行,推进循环 }
2. 修正文件路径转义问题
Windows系统下路径分隔符需要用双反斜杠\\,或者用正斜杠/避免转义错误:
String filePath = System.getProperty("user.dir") + "/src/test/resources/TestDataProvider/TestDataProvider.xlsx";
3. 优化Excel读取的健壮性
处理空行/空单元格避免空指针异常,同时改用for循环结合getLastRowNum()让逻辑更直观:
public class ExcelDataProvider { @DataProvider(name = "excelData") public Object[][] getData() throws IOException { String filePath = System.getProperty("user.dir") + "/src/test/resources/TestDataProvider/TestDataProvider.xlsx"; try (FileInputStream fileInputStream = new FileInputStream(filePath); XSSFWorkbook workBook = new XSSFWorkbook(fileInputStream)) { XSSFSheet sheet = workBook.getSheet("Values"); if (sheet == null) { return new String[0][2]; } int lastRowNum = sheet.getLastRowNum(); List<String[]> dataList = new ArrayList<>(); for (int i = 0; i <= lastRowNum; i++) { XSSFRow row = sheet.getRow(i); if (row == null) continue; XSSFCell cell1 = row.getCell(0); if (cell1 == null) continue; cell1.setCellType(CellType.STRING); String s = cell1.getStringCellValue(); if ("0".equals(s)) { break; } XSSFCell cell2 = row.getCell(1); String val1 = cell1.getStringCellValue(); String val2 = cell2 != null ? cell2.getStringCellValue() : ""; dataList.add(new String[]{val1, val2}); } return dataList.toArray(new String[dataList.size()][2]); } } }
4. 资源自动关闭优化
使用try-with-resources语法,确保FileInputStream和XSSFWorkbook自动关闭,避免资源泄漏。
额外注意事项
- 确认Excel中作为终止标记的
0是字符串类型,避免因单元格类型不匹配导致判断失效 - 测试时可以先打印
i的值,验证循环是否正常推进
内容的提问来源于stack exchange,提问作者Sujan Prathi
相关产品推荐
相关产品推荐

