当前位置: 首页 > 知识库问答 >
问题:

使用JMeter从ForEach控制器中的目录中自动读取多个CSV文件

杭志泽
2023-03-14

Im试图从While控制器中的特殊目录读取多个CSV文件,以将文件中的数据转换为特定的JMeter属性/变量。但我总是得到一个错误:

ERROR - jmeter.threads.JMeterThread: Test failed! java.lang.IllegalArgumentException: File ${CURRENTACTIONATTRIBUTEFILE} must exist and be readable

有没有可能这个变量现在没有被求值?(__v不能改变任何东西)。我真的不知道为什么这不起作用。

当我在ForEach和While控制器之间放置一个调试采样器时,它会显示JMeterVariable CURRENTACTIONATTRIBUTEFILE具有正确的路径和文件名(当我在CSV数据集config filename中粘贴硬编码的字符串时,它会工作):

CURRENTACTIONATTRIBUTEFILE=C:/#JMeter/Plans/PRODUCT/61_RISK2VALUE/61_RISK2VALUE - Resources/ModelingData/ActionAttributes/ActionAttributes_AM2.csv

这是我的Testplan设置的样子:

>

  • 创建文件变量:groovy采样器,它检查一个特殊目录,并创建带有文件路径+名称+扩展名的编号var,以及一个带有目录中文件计数的var

    ForEach控制器

    >

  • while控制器

    • CSV数据集配置(文件名:${CURRENTACTIONATTRIBUTEFILE)
    • 创建变量:groovy采样器,它为我需要的特殊约定创建属性/变量

    “创建文件变量”-采样器代码:

    String actionAttributeFilePath = "${PATHPLAN}${PATHMODELINGDATA}ActionAttributes/";
    File modelingDataDirectory = new File(actionAttributeFilePath);
    
    File[] files = modelingDataDirectory.listFiles();
    int fileCounter = 1;
    for (File file : files) {
        if(file)
        {
            String actionAttributeFile = actionAttributeFilePath + file.getName();
             vars.put("ACTIONATTRIBUTEFILE_" + fileCounter, actionAttributeFile);
             fileCounter++;
        }
    }
    vars.put("ACTIONATTRIBUTEFILE_COUNT", Integer.toString(fileCounter-1))
    

    “创建变量”-采样器代码(与我的问题无关):

    下面使用的所有变量名称都来自CSV数据集配置。

    if ("${ATTRIBUTEDEFINITIONID}" != "<EOF>")
    {
        def variableName = sprintf('ATTRIBUTE%2$sDEFINITIONID_%1$s',["${ATTRIBUTEFORMULANAME}", "${ATTRIBUTETYPE}"])
        props.put(variableName,"${ATTRIBUTEDEFINITIONID}");
    }
    
  • 共有2个答案

    姬雪松
    2023-03-14

    CSV数据集配置元素有一个名为filename的字段,您需要在该字段中指定CSV的文件名及其“路径”。

    默认情况下,JMeter开始在JMeter根/主文件夹(\apache-jmeter-x.xx\bin)或JMeter脚本(.jmx文件)所在的同一文件夹中查找数据文件。

    因此您可以将csv文件放在与.jmx相同的目录中。

    宋鸿云
    2023-03-14

    您将无法使用JMeter变量作为CSV数据集配置文件名,因为CSV数据集配置在任何变量之前被初始化。

    使其动态化的唯一方法是使用JMeter属性而不是JMeter变量

    >

  • ${CURRENTACTIONATTRIBUTEFILE}变量引用替换为JMeter属性,使用__p()函数作为${__p(CURRENTACTIONATTRIBUTEFILE,)}

    通过-j命令行参数提供属性值,如:

    jmeter -JCURRENTACTIONATTRIBUTEFILE="C:/#JMeter/Plans/PRODUCT/61_RISK2VALUE/61_RISK2VALUE - Resources/ModelingData/ActionAttributes/ActionAttributes_AM2.csv" 
    

    设置属性的另一种方法是在user.properties文件中定义它,如下所示:

    CURRENTACTIONATTRIBUTEFILE="C:/#JMeter/Plans/PRODUCT/61_RISK2VALUE/61_RISK2VALUE - Resources/ModelingData/ActionAttributes/ActionAttributes_AM2.csv"
    

    参考资料:

    • 配置JMeter
    • Apache JMeter属性自定义指南

  •  类似资料:
    • 我正在JMeter中做教师工具测试。我在.csv文件中有30个条目。我想迭代前10个条目通过任何逻辑控制器为线程一和其他10个条目与相同的控制器为第二个线程,这个过程应该重复3个线程数。在逻辑控制器内部,我有http采样器。 线程组(3)-csv配置文件-foreach控制器(1-10)-http采样器-

    • 我使用Jmeter和Selenium Webdriver采样器 代码CSV配置 我的问题是它没有从CSV中挑选。以上两行生成结果“loginName”,而不是从文件中选择实际的登录名。我用过单引号、双引号等,但运气不佳。使用${loginName}会产生错误。知道什么地方出了问题,如何解决吗?

    • 我想让我的Jmeter从一个位置读取多个csv文件,比如C:\Jmeter\file。 当前,如果我在csv数据集配置下的'filename'中提供特定的csv文件名,Jmeter会识别该文件并执行我的脚本。 我不想对文件名进行硬编码,我想让jmeter从该位置自动读取。 我已经编写了BeenShell预处理器(因为我找不到任何简单的解决方案),这个程序从位置读取所有csv文件列表,并将它们存储在

    • 我需要从不是父目录或子目录的多个路径读取拼花地板文件。 例如, 从dir1\u 1和dir1\u 2读取拼花文件 现在,我正在读取每个目录并使用“unionAll”合并数据帧。有没有一种方法可以不使用unionAll从dir1\u 2和dir2\u 1读取拼花地板文件,或者有没有什么奇特的方法可以使用unionAll 谢谢

    • 我读了很多关于这个话题的答案,但我找不到适合我的答案。 null 线程组 主页 循环控制器 ---登录 -----CSV DataSetConfig [另一个http调用] 如果我将线程数设置为2并循环到2,我将得到树: null null 主页1 登录用户1 登录用户2 我还尝试在登录调用之前将CSV数据集放在线程组中。如果我设置2个用户启动流,总是从CSV中选择第一行。 我需要的是: null

    • CSV文件中的数据在jeter从系统中未读取 请查看以下关于该问题的详细信息。 线程组 HTTP 请求 CSV 数据集配置 [查看结果树][4] csv 文件 :p一个