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

自动化测试读取CSV文件报错:Attempt to read from null array

问题分析与解决

你遇到的Attempt to read from null array错误,核心原因是**csvCell变量为null时,你尝试访问它的索引[0]**,具体问题出在这几个地方:

  1. 你的TestData类中,csvCell是类成员变量,在readFile方法的循环结束后,csvCell = csvReader.readNext()会被赋值为null(因为读完所有行后readNext()返回null),后续访问csvCell[0]自然报错。
  2. readFile方法只是循环读取了CSV内容,但没有保存任何有效数据,最后返回null,等于白执行了读取操作。
  3. 若你没有正确调用readFile方法初始化csvCell,它会保持初始的null状态,访问索引同样触发错误。

修复方案

1. 先定义数据模型类(存储单条测试数据)

创建一个类来封装CSV里的单条用户数据,方便后续调用:

public class UserData {
    private String phone;
    private String idnp;
    private String cardNumber;

    public UserData(String phone, String idnp, String cardNumber) {
        this.phone = phone;
        this.idnp = idnp;
        this.cardNumber = cardNumber;
    }

    // 提供getter方法获取数据
    public String getPhone() { return phone; }
    public String getIdnp() { return idnp; }
    public String getCardNumber() { return cardNumber; }
}

2. 修改TestData类,正确读取并保存CSV数据

把CSV数据保存到集合中,避免使用类成员变量存储临时读取的数组:

import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import au.com.bytecode.opencsv.CSVReader;

public class TestData {
    private static final String DATA_CSV_PATH = "src/androidTest/java/md/app/TestData/Data.csv";
    private List<UserData> userDataList;

    // 加载CSV数据到集合
    public void loadData() throws IOException, CsvValidationException {
        userDataList = new ArrayList<>();
        // 使用try-with-resources自动关闭流,避免资源泄漏
        try (CSVReader csvReader = new CSVReader(new FileReader(DATA_CSV_PATH))) {
            // 跳过CSV表头行(你的第一行是列名,不是测试数据)
            csvReader.readNext();
            String[] csvCell;
            while ((csvCell = csvReader.readNext()) != null) {
                // 移除数据中的双引号,避免输入到控件中带引号
                String phone = csvCell[0].replace("\"", "");
                String idnp = csvCell[1].replace("\"", "");
                String cardNumber = csvCell[2].replace("\"", "");
                userDataList.add(new UserData(phone, idnp, cardNumber));
            }
        }
    }

    // 根据索引获取指定的测试数据
    public UserData getUserData(int index) {
        if (userDataList == null || index < 0 || index >= userDataList.size()) {
            throw new IllegalArgumentException("数据未加载或索引无效");
        }
        return userDataList.get(index);
    }
}

3. 在自动化测试中调用修改后的代码

// 初始化并加载测试数据
TestData testData = new TestData();
try {
    testData.loadData();
} catch (IOException | CsvValidationException e) {
    e.printStackTrace();
    // 处理数据加载失败的情况,比如终止测试
}

// 获取第一行测试数据
UserData userData = testData.getUserData(0);
// 输入手机号到控件
onView(withId(R.id.et_phone_number)).perform(typeText(userData.getPhone()));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:31:18