Testing 如何使用CSV数据集配置';Jmeter中Bean Shell后处理器中的s变量

Testing 如何使用CSV数据集配置';Jmeter中Bean Shell后处理器中的s变量,testing,jmeter,automated-tests,performance-testing,load-testing,Testing,Jmeter,Automated Tests,Performance Testing,Load Testing,在我的应用程序中,我有两个场景 1。创建:我们在这里预订了一个酒店房间。预订后,应用程序返回一个事务ID 2。取消:我们需要将交易Id传递给应用程序以取消预订 我想用jmeter进行测试,这样在进行create调用之后,相应create的cancel调用将自动使用生成的事务ID进行调用 所以我创建了两个线程组。一个用于create,我调用createapi,使用正则表达式提取器和Bean Shell后处理器将事务Id保存在CSV文件中。另一个线程是cancel,我使用CSV数据集配置选择事务

在我的应用程序中,我有两个场景

  • 1。创建:我们在这里预订了一个酒店房间。预订后,应用程序返回一个事务ID
  • 2。取消:我们需要将交易Id传递给应用程序以取消预订
  • 我想用jmeter进行测试,这样在进行create调用之后,相应create的cancel调用将自动使用生成的事务ID进行调用
所以我创建了两个线程组。一个用于create,我调用createapi,使用正则表达式提取器和Bean Shell后处理器将事务Id保存在CSV文件中。另一个线程是cancel,我使用CSV数据集配置选择事务ID&调用CancelAPI

问题是我想在调用CancelAPI后从CSV文件中删除该事务ID。我认为BeanShell后处理器将完成这项工作。这是我的CSV数据集配置:

以下是我的Bean Shell后处理器代码:

File inputFile = new File("/home/demo/LocalFolder/CSV/result.csv");
File tempFile = new File("/home/demo/LocalFolder/CSV/myTempFile.csv");

BufferedReader reader;
try {
    reader = new BufferedReader(new FileReader(inputFile));

    BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));

    String lineToRemove = vars.get("transactionId");
    //String lineToRemove = "${transactionId}";
    String currentLine;

    while((currentLine = reader.readLine()) != null) {
        // trim newline when comparing with lineToRemove
        String trimmedLine = currentLine.trim();
        if(trimmedLine.equals(lineToRemove)) continue;
        writer.write(currentLine + System.getProperty("line.separator"));
    }
    writer.close(); 
    reader.close(); 
    boolean successful = tempFile.renameTo(inputFile);
    System.out.println("Completed");
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

但是事务ID没有从文件中删除。我认为
vars.get(“transactionId”)
没有返回任何内容或返回错误的值。如果我硬编码一个交易ID,那么代码工作正常。有人能帮我吗?

JMeter变量仅对当前线程组是局部的,为了在线程组之间传递数据,您需要使用JMeter属性(
props
而不是
vars
)。有关更详细的解释和用法示例,请参阅本文


另外,也许改用JMeter会更容易些?

JMeter变量只对当前线程组进行局部,为了在线程组之间传递数据,您需要使用JMeter属性(
props
而不是
vars
)。有关更详细的解释和用法示例,请参阅本文


另外,也许它更易于使用?

在负载测试期间操作文件的方法不是一种可伸缩的方法。您想将它们写入文件的具体原因是什么?将提取的值传递给“内存中”的下一个线程就可以了。你能详细解释一下为什么你需要把这个写进一个文件,然后删除它吗?因为你想在创建调用之后按顺序取消调用,我认为使用两个线程组会使你的场景不必要地复杂化。只需将它们放在一个组中,并将事务ID保存为变量。但如果您真的想使用2个线程组,@Kranthi Paidi是正确的:这不是一个可伸缩的解决方案(因为许多线程将在队列中等待读取/写入同一文件)。使用“线程间通信”插件,它作为FIFO队列工作(这基本上是您试图在脚本中实现的)。在负载测试期间操纵文件的方法不是可伸缩的方法。您想将它们写入文件的具体原因是什么?将提取的值传递给“内存中”的下一个线程就可以了。你能详细解释一下为什么你需要把这个写进一个文件,然后删除它吗?因为你想在创建调用之后按顺序取消调用,我认为使用两个线程组会使你的场景不必要地复杂化。只需将它们放在一个组中,并将事务ID保存为变量。但如果您真的想使用2个线程组,@Kranthi Paidi是正确的:这不是一个可伸缩的解决方案(因为许多线程将在队列中等待读取/写入同一文件)。使用“线程间通信”插件,它作为FIFO队列工作(这基本上就是您试图在脚本中实现的)。