You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用TestNG+Selenium WebDriver读取Excel多组数据重复运行测试用例(解决空指针)

问题根源分析
  1. 静态资源污染导致重复运行失败:你使用了静态的xssfWorkbook和xssfSheet,第一次测试关闭资源后,静态变量保留了已关闭的实例,第二次运行时会触发状态异常。
  2. 空单元格触发NullPointerException:当Excel中某行的邮箱/密码单元格为空时,getCell(c)返回null,直接调用toString()会抛出空指针异常。
  3. 资源释放不严谨:手动关闭流和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:48:15