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

跨类向ArrayList添加日志失败及IndexOutOfBound异常问题求助

问题描述

尝试通过Setter/Getter方法将不同页面类的方法执行日志存入ArrayList<String>时,出现IndexOutOfBound异常,且page1.login(username,password)这类页面方法的日志无法存入集合——只有把页面方法直接写在BaseUtil类里,日志才能正常存储。涉及4个核心类:基类(BaseUtil)、测试用例1类、测试用例2类、报告生成类(ReportGeneration)。

用户提供的核心代码如下:

报告生成类(原代码)

public class ReportGeneration(){
    // 错误:构造方法内不能定义成员变量
    private ArrayList<String> logger = new ArrayList<String>()

    public ArrayList<String> getLogs(){
       return logger;
    }

    // 错误:void方法不能返回值
    public void setLogs(String log){
       return logger.add(log);
    }

    public void htmlReportGeneration(){
        // HTML报告生成逻辑
    }
}

BaseUtil类(原代码)

public class BaseUtil{
    // 每次实例化BaseUtil都会创建新的ReportGeneration实例
    ReportGeneration reports = new ReportGeneration();
    
    public void resultsPass(String log){
        // Pass日志处理逻辑
        reports.setLogs(log);
    } 
    
    public void resultsFAIL(String log){
        // Fail日志处理逻辑
        reports.setLogs(log);
    }
    
    public void report(){
        // 读取结果文件夹中的测试用例
        // 示例:结果文件夹中有10个测试用例结果
        for(int i=0;i<testcases.size();i++){
            // 错误:getLogs()返回集合,需用get(i)获取元素;且变量名应为reports而非report
            reports.htmlReportGeneration(report.getLogs(i).toString);
        }
    }
}

测试用例类(原代码)

public class TestCaseOne extends BaseUtil{
    public void testcaseValidation(){
        resultsPass("Successfully Opened Browser");
        resultsPass("Successfully Opened URL");
        resultsFAIL("Not able to login to Account ");

        // page1.login内的日志无法存入集合
        page1.login(username,password);
    }
}

问题根源

  1. ReportGeneration实例不共享:BaseUtil每次实例化都会创建新的ReportGeneration对象,页面类(如page1)若单独调用日志方法,会写入另一个独立的集合实例,导致最终生成报告时集合为空或长度不足,触发索引越界。
  2. 代码语法错误:构造方法内定义成员变量、void方法返回值、集合元素调用方式错误等,直接导致日志存储或读取失败。
  3. 页面类日志未接入共享集合:page1.login内调用的日志方法,未使用测试用例类继承的BaseUtil实例对应的集合,而是写入了其他独立实例。

解决方案

1. 将ReportGeneration改为单例类

确保整个项目中只有一个ReportGeneration实例,所有类共享同一个日志集合:

public class ReportGeneration {
    private static ReportGeneration instance;
    private final ArrayList<String> logger = new ArrayList<>();

    // 私有构造方法,禁止外部实例化
    private ReportGeneration() {}

    // 获取全局唯一实例
    public static ReportGeneration getInstance() {
        if (instance == null) {
            instance = new ReportGeneration();
        }
        return instance;
    }

    public ArrayList<String> getLogs() {
        return logger;
    }

    public void setLogs(String log) {
        logger.add(log); // void方法无需返回值
    }

    public void htmlReportGeneration(String log) {
        // 接收日志参数并生成HTML报告的逻辑
    }
}

2. 修正BaseUtil类的实例引用

BaseUtil不再新建ReportGeneration,而是使用单例实例:

public class BaseUtil {
    // 使用全局单例实例
    private final ReportGeneration reports = ReportGeneration.getInstance();

    public void resultsPass(String log) {
        // Pass日志处理逻辑
        reports.setLogs(log);
    }

    public void resultsFAIL(String log) {
        // Fail日志处理逻辑
        reports.setLogs(log);
    }

    public void report() {
        // 遍历日志集合而非测试用例数量,避免索引越界
        ArrayList<String> logs = reports.getLogs();
        for (String log : logs) {
            reports.htmlReportGeneration(log);
        }
    }
}

3. 确保页面类接入共享集合

页面类(如page1)需通过单例或测试用例传递的BaseUtil实例写入日志:

方式1:直接使用ReportGeneration单例

public class Page1 {
    private final ReportGeneration reports = ReportGeneration.getInstance();

    public void login(String username, String password) {
        // 输入用户名逻辑
        reports.setLogs("Successfully entered username: " + username);
        // 输入密码逻辑
        reports.setLogs("Successfully entered password");
        // 登录操作
        try {
            // 登录逻辑
            reports.setLogs("Successfully logged in");
        } catch (Exception e) {
            reports.setLogs("Failed to login: " + e.getMessage());
        }
    }
}

方式2:从测试用例传递BaseUtil实例

public class TestCaseOne extends BaseUtil {
    public void testcaseValidation() {
        resultsPass("Successfully Opened Browser");
        resultsPass("Successfully Opened URL");
        resultsFAIL("Not able to login to Account ");

        // 将当前BaseUtil实例传递给page1
        Page1 page1 = new Page1(this);
        page1.login(username, password);
    }
}

// 修改Page1类
public class Page1 {
    private final BaseUtil baseUtil;

    public Page1(BaseUtil baseUtil) {
        this.baseUtil = baseUtil;
    }

    public void login(String username, String password) {
        baseUtil.resultsPass("Successfully entered username");
        // 其他登录操作的日志写入
    }
}

4. 修复索引越界问题

原代码中循环基于测试用例数量,若日志数量与测试用例数量不匹配会触发异常,需改为遍历日志集合:

// 错误写法:基于testcases.size()循环
// for(int i=0;i<testcases.size();i++){...}

// 正确写法:遍历日志集合
for (String log : reports.getLogs()) {
    reports.htmlReportGeneration(log);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:45:06