多个线程(并行测试用例)如何在 Java(Selenium)设置中使用 Apache POI 同时访问同一个 excel 文件?
Posted
技术标签:
【中文标题】多个线程(并行测试用例)如何在 Java(Selenium)设置中使用 Apache POI 同时访问同一个 excel 文件?【英文标题】:How can multiple threads (parallel testcases) access same excel file at same time using Apache POI in Java (Selenium) setup? 【发布时间】:2018-08-10 02:12:19 【问题描述】:我的数据依赖测试场景很少,其中我有一个 Excel 文件作为数据源,并且需要从该文件同时执行多个测试用例。
我已经准备好一次可以运行 1 个测试的解决方案。但是当我尝试运行多个测试时,Apache 抛出错误。我认为这是因为多个线程试图同时访问相同的资源。如何克服这种情况?我在 Java 中使用 Apache-POI 库进行 Selenium 测试的解决方案。
编辑:
错误信息: org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: 保存包时出错:/xl/media/image13.png 部分失败使用 marshaller org.apache.poi.openxml4j.opc.internal.marshallers.DefaultMarshaller@329cf141 保存在流中
操作系统: Windows 10、x64
代码: 第 1 步: 创建一个 Workbook 对象,如下所示
Workbook wb = null;
try
wb = WorkbookFactory.create(input_file);
catch (java.io.FileNotFoundException e)
Results.fail("Excel file not found at this location: " + Excel_File_Name_And_Path);
第 2 步:一一遍历所有行并将相关信息保存到各种 Java 变量中
第 3 步:关闭 Workbook 对象并继续测试(现在拥有所有相关数据)
ExcelConfiguration.closeworkbook(wb);
public static void closeworkbook(Workbook wb)
try
wb.close();
System.out.println("workbook closed");
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException ioexcep)
ioexcep.printStackTrace();
【问题讨论】:
我对 POI 的了解不够,无法知道为什么它不能同时读取同一个文件。但是您可以共享“阅读器”或只是暂时复制文件以阅读它.. 错误是什么?你的代码是什么样的?你在什么操作系统上?您的问题中没有足够的信息来提供合理的答案。 @Brian 按要求添加了 cmets。请再看一遍 【参考方案1】:当您关闭文件时,POI 似乎正在写回文件。您可以尝试使用different create
call 以只读模式打开它:
wb = WorkbookFactory.create(input_file, null, true);
这将以只读模式打开文件,并应跳过关闭时写入行为。
【讨论】:
【参考方案2】:如果您不想深入研究 POI 内部,只需在 static
初始化块的单例类中加载一次即可。
如果您的代码是真正只读的,则应该没有缺点,因为 static
块将在类初始化期间只执行一次。
【讨论】:
以上是关于多个线程(并行测试用例)如何在 Java(Selenium)设置中使用 Apache POI 同时访问同一个 excel 文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在机器人框架中并行运行多个测试套件上的多个测试用例 | Python