首页 > 解决方案 > Jmeter tearDown Thread Group 无法访问之前使用过的线程组文件

问题描述

我有一个包含多个线程组的测试计划,这些线程组将摘要报告结果写入服务器中托管的同一个 csv 文件中,使用网络驱动器(z:) 并更改 jmeter.properties -> resultcollector.action_if_file_exists=APPEND 可以正常工作。

最后,我有一个拆解线程组,它将 csv 数据插入 sql 服务器(之前使用的网络驱动器托管在此服务器的 c:\jmeter\results.csv 中),然后删除 csv。情况是,当我完整运行测试计划时,我总是遇到此错误:“无法批量加载,因为无法打开文件“c:\jmeter\results.csv”。操作系统错误代码 32”

奇怪的是,如果我单独启动 tearDown 线程组它工作正常,它会在 sql server 中进行批量插入,然后删除 de csv。

我 2 天前开始使用 Jmeter,所以我确定我误解了一些东西:S

汇总报告配置

JDBC 请求

删除 csv 的 BeanShell PostProcessor

测试计划结构

标签: multithreadingcsvjmeter

解决方案


发生这种情况是因为摘要报告(以及其他侦听器)保持文件打开直到测试结束,因此您需要以某种方式触发此“关闭”事件。

从 JMeter 3.1 开始,您应该使用 JSR223 测试元素和 Groovy 语言进行脚本编写,因此将此 B​​eanshell PostProcessor 替换为JSR223 PostProcessor并使用以下代码:

import org.apache.jmeter.reporters.ResultCollector
import org.apache.jorphan.collections.SearchByClass


def engine = engine = ctx.getEngine()
def test = engine.getClass().getDeclaredField('test')

test.setAccessible(true)

def testPlanTree = test.get(engine)

SearchByClass<ResultCollector> listenerSearch = new SearchByClass<>(ResultCollector.class)
testPlanTree.traverse(listenerSearch)
Collection<ResultCollector> listeners = listenerSearch.getSearchResults()

listeners.each { listener ->
    def files = listener.files
    files.each { file ->
        file.value.pw.close()
    }
}

new File('z:/result.csv').delete()

有关 JMeter 中 Groovy 脚本的更多信息:Apache Groovy - 为什么以及如何使用它


推荐阅读