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

Selenium TestNG中如何让DataProvider仅返回Excel标记为Y的行

解决TestNG DataProvider过滤用例不显示在报告中的问题

你的问题核心在于当前是在测试方法内部通过抛出SkipException来跳过用例,但TestNG仍会将这些用例标记为"跳过"并显示在报告里。要让未标记为"Y"的用例完全不进入测试报告,正确的做法是在DataProvider读取Excel数据时就直接过滤掉不符合条件的行——这样这些用例根本不会被TestNG执行,自然不会出现在报告中。

具体修改步骤:

  1. 改用List临时存储符合条件的测试数据(因为无法提前预知符合条件的行数,固定大小数组不够灵活)
  2. 遍历Excel行时,先检查标记列(对应你代码里的lll参数)的值是否为"Y",只有符合条件的行才加入List
  3. 最后将List转换为String[][]返回给DataProvider
  4. 测试方法中可以移除判断和抛异常的逻辑,因为DataProvider已经保证只返回需要执行的用例

修改后的完整代码:

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import jxl.Workbook;
import jxl.Sheet;
import jxl.Cell;
import jxl.read.biff.BiffException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class YourTestClass {

    @Test(dataProvider = "testdata")
    public void Create(String TC_ID, String TC_Name, String Username, String Password, String aaa, String bbb, String ccc, String ddd, String eee, String fff, String ggg, String hhh, String iii, String jjj, String kkk, String lll) throws InterruptedException {
        // 现在DataProvider已经过滤过,这里直接编写你的测试逻辑即可
        System.out.println("Executing test case: " + TC_ID + " - " + TC_Name);
        // 你的业务测试代码...
    }

    @DataProvider(name = "testdata")
    public String[][] readExcel() throws BiffException, IOException {
        File f = new File("C:/Test input/Test.xls");
        Workbook wb = Workbook.getWorkbook(f);
        Sheet s = wb.getSheet("Sheet1");
        int rows = s.getRows();
        int columns = s.getColumns();
        
        // 用List存储符合条件的行数据
        List<String[]> validRows = new ArrayList<>();
        
        // 跳过表头行(从第2行开始遍历,i从1开始)
        for (int i = 1; i < rows; i++) {
            // 获取标记列的值(这里假设lll是最后一列,对应索引columns-1;如果标记列位置不同,请自行调整索引)
            Cell flagCell = s.getCell(columns - 1, i);
            String flagValue = flagCell.getContents();
            
            if ("Y".equals(flagValue)) {
                // 标记为Y时,将整行数据存入数组并加入List
                String[] rowData = new String[columns];
                for (int j = 0; j < columns; j++) {
                    Cell c = s.getCell(j, i);
                    rowData[j] = c.getContents();
                }
                validRows.add(rowData);
            }
        }
        
        // 将List转换为二维数组返回
        String[][] inputData = new String[validRows.size()][columns];
        for (int i = 0; i < validRows.size(); i++) {
            inputData[i] = validRows.get(i);
        }
        
        wb.close(); // 记得关闭工作簿,避免资源泄漏
        return inputData;
    }
}

关键说明:

  • 过滤时机前置:把筛选逻辑放在DataProvider阶段,确保只有需要执行的用例被TestNG识别,从根源上避免无关用例进入报告
  • 动态存储数据:用List灵活添加符合条件的行,避免固定数组的空间浪费或不足问题
  • 简化测试方法:不需要再处理跳过逻辑,让测试方法专注于业务测试代码
  • 资源释放:新增wb.close()关闭Excel工作簿,防止资源占用

内容的提问来源于stack exchange,提问作者Satayu Barari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:13:13