跨类向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); } }
问题根源
- ReportGeneration实例不共享:BaseUtil每次实例化都会创建新的ReportGeneration对象,页面类(如page1)若单独调用日志方法,会写入另一个独立的集合实例,导致最终生成报告时集合为空或长度不足,触发索引越界。
- 代码语法错误:构造方法内定义成员变量、void方法返回值、集合元素调用方式错误等,直接导致日志存储或读取失败。
- 页面类日志未接入共享集合: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
相关产品推荐
相关产品推荐

