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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:30:02