多个线程(并行测试用例)如何在 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

我们可以在Jmeter的单个测试计划中并行运行两个线程组吗?

多线程并行与分布式执行

Jmeter--多个线程组顺序执行和并行执行

如何在负载测试中将一个数据源用于多个测试用例

如何确定将大量文件复制到外部共享文件夹的理想并行Java线程数?