多个线程(并行测试用例)如何使用Java(Selenium)设置中的Apache POI同时访问同一个excel文件?

问题描述 投票:1回答:2

我有几个数据相关的测试场景,我有一个Excel文件作为数据源,需要同时从该文件执行多个测试用例。

我已经准备好了一个解决方案,我可以一次运行1个测试。但是当我尝试运行多个测试时,Apache就会抛出错误。我认为那是因为多个线程试图同时访问相同的资源。如何克服这种情况?我的解决方案使用Java中的Apache-POI库进行Selenium测试。

编辑:

错误消息:org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException:无法保存:保存包时发生错误:部件/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();

            }
        }
java excel multithreading selenium apache-poi
2个回答
2
投票

当您关闭它时,看起来POI正在写回文件。您可以尝试使用different create call以只读模式打开它:

wb = WorkbookFactory.create(input_file, null, true);

这将以只读模式打开文件,并应跳过write-on-close行为。


0
投票

如果您不想深入POI内部,只需在static初始化块中的单个类中加载一次。

如果您的代码是真正的只读,那么应该没有任何缺点,因为static块在类初始化期间只会被执行一次。

© www.soinside.com 2019 - 2024. All rights reserved.