Java Selenium JSON参数化DDT代码运行失败,请求排查问题原因
Java Selenium JSON参数化失败问题排查
问题背景
尝试使用JSON对Java Selenium程序进行参数化,数据存储在data.JSON文件中,已添加全部依赖项,但运行代码时失败,需排查问题。
相关代码
JSONDataClass.java
public class JsonDataClass { @Test public List<HashMap<String, String>> getJsonDataToMap() throws IOException { String FileDir = System.getProperty("user.dir")+"//src//DDT//data.json"; System.out.println(FileDir); String jsonContent = FileUtils.readFileToString(new File(System.getProperty("user.dir")+"//src//DDT//data.json"),StandardCharsets.UTF_8); System.out.println(jsonContent); //List<HashMap<String, String>> data = mapper.readValue(jsonContent, new TypeReference<List<HashMap<String, String>>>()); List<HashMap<String, String>> dataHashMap = new Gson() .fromJson(jsonContent, new TypeToken<List<HashMap<String, String>>>() {}.getType()); return dataHashMap; } @DataProvider public Object[][] getData() throws IOException{ List<HashMap<String, String>> pdata =getJsonDataToMap(); return new Object[][]{{pdata.get(0)},{pdata.get(1)}}; } @Test(dataProvider="getData") public void fetchingdata(HashMap<String, String> input) { System.out.println(input.get("email")); System.out.println(input.get("username")); System.out.println(input.get("password")); } }
data.JSON
[ { "email":"abc@gmail.com", "username":"user@gmail.com", "password":"pass123" } { "email":"abc2nd@gmail.com", "username":"user2nd@gmail.com", "password":"pass2222" } ]
testng.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite name="Suite"> <test thread-count="5" name="Test"> <classes> <class name="DDT.JsonDataClass"></class> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
问题分析与修复
1. JSON文件语法错误
data.JSON中数组的两个对象之间缺少逗号,违反JSON语法规范,会直接导致Gson解析失败。
修复后data.JSON:
[ { "email":"abc@gmail.com", "username":"user@gmail.com", "password":"pass123" }, { "email":"abc2nd@gmail.com", "username":"user2nd@gmail.com", "password":"pass2222" } ]
2. 工具方法错误添加@Test注解
getJsonDataToMap是数据读取工具方法,不需要@Test注解。TestNG会将带有该注解的方法视为测试用例执行,导致额外的执行流程错误,甚至可能因返回值不匹配触发异常。
修复:移除getJsonDataToMap方法上的@Test注解。
3. 硬编码索引导致潜在越界问题
getData方法中直接通过pdata.get(0)和pdata.get(1)获取数据,若JSON文件中数据条数变化,会引发IndexOutOfBoundsException。应动态遍历列表生成测试数据:
修复后getData方法:
@DataProvider public Object[][] getData() throws IOException{ List<HashMap<String, String>> pdata = getJsonDataToMap(); Object[][] testData = new Object[pdata.size()][1]; for(int i=0; i<pdata.size(); i++){ testData[i][0] = pdata.get(i); } return testData; }
4. 文件路径优化(可选)
使用Paths类构建路径,避免跨平台路径分隔符问题:
优化后路径代码:
String filePath = Paths.get(System.getProperty("user.dir"), "src", "DDT", "data.json").toString(); String jsonContent = FileUtils.readFileToString(new File(filePath), StandardCharsets.UTF_8);
修复后完整JSONDataClass.java
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.apache.commons.io.FileUtils; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Paths; import java.util.HashMap; import java.util.List; public class JsonDataClass { public List<HashMap<String, String>> getJsonDataToMap() throws IOException { String filePath = Paths.get(System.getProperty("user.dir"), "src", "DDT", "data.json").toString(); System.out.println(filePath); String jsonContent = FileUtils.readFileToString(new File(filePath), StandardCharsets.UTF_8); System.out.println(jsonContent); List<HashMap<String, String>> dataHashMap = new Gson() .fromJson(jsonContent, new TypeToken<List<HashMap<String, String>>>() {}.getType()); return dataHashMap; } @DataProvider public Object[][] getData() throws IOException{ List<HashMap<String, String>> pdata = getJsonDataToMap(); Object[][] testData = new Object[pdata.size()][1]; for(int i=0; i<pdata.size(); i++){ testData[i][0] = pdata.get(i); } return testData; } @Test(dataProvider="getData") public void fetchingdata(HashMap<String, String> input) { System.out.println(input.get("email")); System.out.println(input.get("username")); System.out.println(input.get("password")); } }
内容的提问来源于stack exchange,提问作者satyamsingh
相关产品推荐
相关产品推荐

