TestNG数据驱动测试被跳过,DP.java存在未检查/不安全操作问题
运行TestNG数据驱动测试时,测试被跳过,编译提示DP.java uses unchecked or unsafe operations,需用-Xlint:unchecked重新编译查看详情。相关代码及Gradle执行日志如下:
测试类YourTestClass代码
public class YourTestClass { WebDriver driver; // 需要初始化WebDriver @Test(dataProvider = "data-provider",enabled=true,dataProviderClass = DP.class) public void verifyUser_registration_login_logout_test(Method method,String UserName, String Password){ Assertion assertion = new Assertion(); try{ HomePage homePage = new HomePage(driver); homePage.navigateToHomePage(); RegisterPage registerPage = new RegisterPage(driver); registerPage.navigateToRegisterPage(); registerPage.verifyRegisterPage(); registerPage.performRegister(UserName,Password); LoginPage loginPage = new LoginPage(driver); loginPage.performLogin(UserName,Password); homePage.verifyUserLoggedIn(UserName); homePage.clickOnLogoutButton(); WebDriverWait wait = new WebDriverWait(driver, 30); driver.navigate().refresh(); wait.until(ExpectedConditions.urlToBe("SOMEURL")); homePage.verifyUserLoggedOut(); }catch(Exception e){ logStatus("Page test", "navigation to registration page", "failed"); e.printStackTrace(); } }
数据提供类DP代码
public class DP { static String excelPath = "app/src/test/resources/DatasetsSOMEURL.xlsx"; public DP(String excelPath) { DP.excelPath = excelPath; } @DataProvider(name = "data-provider") public static Object[][] dataProviderMethod(Method method) throws IOException { int rowIndex = 0; int cellIndex = 0; List<List> outputList = new ArrayList<List>(); FileInputStream excelFile = new FileInputStream(new File(excelPath)); try (Workbook workbook = new XSSFWorkbook(excelFile)) { Sheet selectedSheet = workbook.getSheet(method.getName()); Iterator<Row> iterator = selectedSheet.iterator(); while (iterator.hasNext()) { Row nextRow = iterator.next(); Iterator<Cell> cellIterator = nextRow.cellIterator(); List<String> innerList = new ArrayList<String>(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); if (rowIndex > 0 && cellIndex > 0) { String cellValue = ""; switch (cell.getCellType()) { case STRING: cellValue = cell.getStringCellValue(); break; case NUMERIC: cellValue = String.valueOf(cell.getNumericCellValue()); break; default: throw new UnsupportedOperationException("Unsupported Cell Type: " + cell.getCellType()); } innerList.add(cellValue); } cellIndex++; } if (!innerList.isEmpty()) { outputList.add(innerList); } rowIndex++; } } Object[][] data = new Object[outputList.size()][]; for (int i = 0; i < outputList.size(); i++) { data[i] = outputList.get(i).toArray(new String[0]); } return data; } }
Gradle执行日志
Task :app:test
Gradle Test Executor 1 STANDARD_ERROR
log4j:WARN No appenders could be found for logger (org.testng.internal.Graph).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
.tests.testCase_01 > verifyUser_registration_login_logout_test SKIPPED
TEST SUMMARY: RAN 1 TESTS, 0 SUCCEEDED, 0 FAILED, 1 SKIPPED
1. 消除unchecked编译警告
DP类中使用了未指定泛型的原始类型List<List>,修改为明确的泛型声明:
List<List<String>> outputList = new ArrayList<>();
同时在Gradle配置中添加-Xlint:unchecked参数,查看完整警告信息:
在build.gradle中添加:
tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:unchecked" }
2. 修复测试跳过问题
编译警告通常不会直接导致测试跳过,重点排查以下点:
- 确认Excel文件路径正确且文件存在;Sheet名称必须与测试方法名
verifyUser_registration_login_logout_test完全匹配 - 检查Excel数据:代码仅读取
rowIndex>0且cellIndex>0的单元格,确保对应行/列有有效数据,若outputList为空,TestNG会跳过测试 - 初始化WebDriver:
YourTestClass中的driver字段未初始化,需在测试前完成初始化(如用@BeforeMethod注解) - 捕获数据提供器异常:在
dataProviderMethod中添加异常处理,避免因Excel读取失败导致测试跳过
3. 解决log4j警告
在src/test/resources目录下创建log4j.properties文件,添加基础配置:
log4j.rootLogger=INFO, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
内容的提问来源于stack exchange,提问作者Anjani Kumar

