如何用TestNG+Selenium WebDriver读取Excel多组数据重复运行测试用例(解决空指针)
问题根源分析
- 静态资源污染导致重复运行失败:你使用了静态的
xssfWorkbook和xssfSheet,第一次测试关闭资源后,静态变量保留了已关闭的实例,第二次运行时会触发状态异常。 - 空单元格触发NullPointerException:当Excel中某行的邮箱/密码单元格为空时,
getCell(c)返回null,直接调用toString()会抛出空指针异常。 - 资源释放不严谨:手动关闭流和Workbook的方式,在异常场景下可能导致资源未释放,影响后续测试运行。
修复方案
1. 修复DataManager.java
移除静态变量,改用局部变量管理资源,通过try-with-resources自动释放流和Workbook,同时处理空单元格:
public static Object[][] readUserCredentials(String sheetName) { try (FileInputStream file = new FileInputStream(System.getProperty("user.dir") + "/TestData/Data.xlsx"); XSSFWorkbook xssfWorkbook = new XSSFWorkbook(file)) { XSSFSheet xssfSheet = xssfWorkbook.getSheet(sheetName); if (xssfSheet == null) { throw new IllegalArgumentException("工作表 " + sheetName + " 在Excel文件中不存在"); } int totalRows = xssfSheet.getLastRowNum(); XSSFRow headerRow = xssfSheet.getRow(0); if (headerRow == null) { throw new RuntimeException("Excel工作表没有表头行"); } int totalCols = headerRow.getLastCellNum(); Object[][] data = new Object[totalRows][totalCols]; for (int r = 0; r < totalRows; r++) { XSSFRow row = xssfSheet.getRow(r + 1); if (row == null) { continue; // 跳过空行 } for (int c = 0; c < totalCols; c++) { XSSFCell cell = row.getCell(c); // 空单元格返回空字符串,避免NullPointerException data[r][c] = cell == null ? "" : cell.toString(); } } return data; } catch (IOException e) { throw new RuntimeException("读取Excel文件失败", e); } }
2. 修复LoginTest.java
添加测试后清理逻辑,确保每次测试环境独立,避免影响下一次运行:
import org.testng.annotations.AfterMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class LoginTest { @Test(dataProvider = "LoginCredentials") public void loginTest(String email, String password) { LandingPage landingPage = new LandingPage(); landingPage.goToWebCentral(); LoginPage loginPage = new LoginPage(); loginPage.typeEmail(email); loginPage.typePassword(password); // 可在此添加登录验证逻辑,比如检查是否跳转至首页 } @DataProvider(name = "LoginCredentials") public Object[][] getData() { return DataManager.readUserCredentials("Login"); } @AfterMethod public void tearDown() { // 每次测试结束后关闭浏览器或重置会话,示例: // DriverSingleton.quitDriver(); } }
额外注意事项
- 确保Excel文件
Data.xlsx的Login工作表中,第一行是表头(如"邮箱"、"密码"),从第二行开始是多组测试数据,每行对应一组登录凭证。 - 如果Excel包含特殊格式单元格(如数值型、日期型),需额外处理单元格类型,避免
toString()返回不符合预期的结果。
内容的提问来源于stack exchange,提问作者Nivasha Pathirana
相关产品推荐
相关产品推荐

