Selenium TestNG中如何让DataProvider仅返回Excel标记为Y的行
解决TestNG DataProvider过滤用例不显示在报告中的问题
你的问题核心在于当前是在测试方法内部通过抛出SkipException来跳过用例,但TestNG仍会将这些用例标记为"跳过"并显示在报告里。要让未标记为"Y"的用例完全不进入测试报告,正确的做法是在DataProvider读取Excel数据时就直接过滤掉不符合条件的行——这样这些用例根本不会被TestNG执行,自然不会出现在报告中。
具体修改步骤:
- 改用
List临时存储符合条件的测试数据(因为无法提前预知符合条件的行数,固定大小数组不够灵活) - 遍历Excel行时,先检查标记列(对应你代码里的
lll参数)的值是否为"Y",只有符合条件的行才加入List - 最后将List转换为
String[][]返回给DataProvider - 测试方法中可以移除判断和抛异常的逻辑,因为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
相关产品推荐
相关产品推荐

