Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jmeter 使用CSV数据集配置和EOF条件时出现问题_Jmeter - Fatal编程技术网

Jmeter 使用CSV数据集配置和EOF条件时出现问题

Jmeter 使用CSV数据集配置和EOF条件时出现问题,jmeter,Jmeter,我在while循环中使用了一个CSv数据集配置。我把它放在一个模块中,并在测试中多次使用同一个模块 我的第一个问题是,我使用以下条件设置了while循环: ${__javaScript("${data}"!="<EOF>")} ${{uuuJavaScript(${data})!=”)} “数据”是我的csv文件中的第一列。除了上一次迭代${data}设置为“EOF”并对其执行所有测试之外,这一切都很好。我希望它在此之前停止,而不是在所有测试都在它上运行一次之后 我的另一个问题是

我在while循环中使用了一个CSv数据集配置。我把它放在一个模块中,并在测试中多次使用同一个模块

我的第一个问题是,我使用以下条件设置了while循环:

${__javaScript("${data}"!="<EOF>")}
${{uuuJavaScript(${data})!=”)}
“数据”是我的csv文件中的第一列。除了上一次迭代${data}设置为“EOF”并对其执行所有测试之外,这一切都很好。我希望它在此之前停止,而不是在所有测试都在它上运行一次之后


我的另一个问题是,当我稍后再次使用此模块时,${data}仍然设置为“EOF”,并且根本不运行任何测试。

如果使用循环控制器,CSV行数就是迭代次数,则可以避免这种情况。只需将此代码放入Beanshell Sampler:

import org.apache.commons.io.FileUtils;

int lines = FileUtils.readLines(new File("/home/username/csv.file")).size();
vars.put("linesCount", String.valueOf(lines));
之后,您可以在循环控制器中使用
lineCount

如果您的
数据
变量需要恢复到原始状态,您可以在其他变量中存储默认值,并在循环结束时使用Beanshell pre/post proccesor将数据恢复到原始状态

编辑:

或者,您可以在While控制器中插入If控制器,并仅在数据不等于EOF时处理所有子元素:

${{uuuJavaScript(${data})!=”)}
要避免此
位,只需将您的逻辑放在下面,然后使用
“${data}”!=“
作为“条件”

有关此用例和其他常见用例的详细说明,请参见指南


UPD。重复使用相同的CSV文件:

在第一个While控制器之后和第二个While控制器之前添加一个,并在“脚本”区域中使用以下代码:

上述脚本将“关闭”原始CSV文件,以便以后可以在脚本中重复使用,并“清除”包含
值的
${data}
变量


有关在JMeter测试中使用Beanshell脚本的详细信息,请参阅指南。

之前关于去重新使用csv文件的建议对我都不起作用。我最终做了一些不同的事情。这比我喜欢的要复杂得多,但它确实有效

我在另一篇帖子()中发布了我的答案,但我将复制并粘贴它,以防将来该链接不起作用


我找不到一个简单的解决办法。我最终使用了beanshell脚本,它让您可以使用非常类似于java的代码来完成一些定制工作。我制作了一个JMeter项目示例来演示如何执行此操作(是的,考虑到我只想重复CSV读取,它非常复杂):


  • 档案:
  • 我的文件结构:

    JMeterExample
    |
    ⊢--JMeterTests.jmx             // the JMeter file
    ⊢--example.csv                 // the CSV file
    
    我的CSV的内容:

    guest-id-1,"123 fake street",
    guest-id-2,"456 fake street",
    guest-id-3,"789 fake street",
    

    在这个线程组中,我只需要一个用户,我将循环两次。我打算每个CSV行发送一个请求。所以总共应该发送6个请求

  • 螺纹组

  • 用户定义变量
  • 这是一种可选的,但是文件路径可能会更改,我不喜欢仅仅为了更改配置而更改脚本。因此,我将CSV文件名存储在“用户定义变量”节点中

    如果将CSV文件存储在与JMeter测试相同的目录中,则只需指定文件名即可

    如果要将CSV保存在包含JMeter文件的目录以外的文件夹中,则需要提供绝对路径,然后稍微修改下面的beanshell脚本:需要注释掉相对加载文件的行,并注释从绝对路径加载的行


  • 用于解析和存储CSV行的BeanShell采样器
  • 添加一个Beanshell采样器,它基本上接受一条路径,并将每一行作为变量进行解析和存储。第一行将存储为名为
    csv\u line\u 0
    的变量,第二行将存储为
    csv\u line\u 1
    ,依此类推。我知道这不是一个干净的解决方案但是。。。我找不到任何干净简单的方法来完成这个干净简单的任务。我在下面复制并粘贴了我的代码

    import org.apache.jmeter.services.FileServer;
    导入java.text.*;
    导入java.io.*;
    导入java.util.*;
    字符串temp=null;
    ArrayList行=新的ArrayList();
    BufferedReader bufRdr;
    ArrayList strList=新的ArrayList();
    //获取文件
    试一试{
    //如果csvFilePath是绝对路径,则可以使用下面的这一行
    //File File=新文件(${csvFilePath});
    //如果csvFilepath是相对路径,则可以使用下面这一行,相对于保存此JMeter文件的位置
    File File=新文件(org.apache.jmeter.services.FileServer.getFileServer().getBaseDir()+“/”+${csvFilePath});
    如果(!file.exists()){
    抛出新异常(“错误:文件“+文件名+”未找到”);
    }
    bufRdr=新的BufferedReader(新的InputStreamReader(新文件InputStream(文件),“UTF8”);
    }捕获(例外e){
    log.error(“加载文件失败”);
    log.error(例如getMessage());
    返回;
    }
    //对于每个CSV行,将其保存到变量中
    int计数器=0;
    while(true){
    试一试{
    temp=bufRdr.readLine();
    如果(temp==null | | temp.equals(“”){
    打破
    }
    行。添加(临时);
    变量输入(“csv_行_”+字符串值(计数器),温度);
    计数器++;
    }捕获(例外e){
    log.error(“获取下一行失败”);
    log.error(例如getMessage());
    打破
    }
    }
    //存储循环计数器的CSV行数
    vars.put(“linescont”,String.valueOf(lines.size());
    

  • 回路控制器
  • 添加循环控制器,每个CSV行循环一次
    ${linescont}
    是CSV行数的计数,根据上述beanShell脚本计算得出


  • 用于从当前CSV行提取数据的Beanshell脚本
  • 此脚本将每CSV行运行一次。它将获取当前行,并解析出其中的任何数据。您必须修改此脚本才能获得所需的数据。在我的例子中,我只有2个柱
    JMeterExample
    |
    ⊢--JMeterTests.jmx             // the JMeter file
    ⊢--example.csv                 // the CSV file
    
    guest-id-1,"123 fake street",
    guest-id-2,"456 fake street",
    guest-id-3,"789 fake street",