如何使用 jmeter 覆盖 csv 文件中的数据

Posted

技术标签:

【中文标题】如何使用 jmeter 覆盖 csv 文件中的数据【英文标题】:How can I overwrite data in csv file using jmeter 【发布时间】:2017-08-07 09:30:21 【问题描述】:

我正在使用 Jmeter 进行 API 自动化,我正在 CSV 文件中写入结果通过或失败。

我无法覆盖旧的结果数据,每次我运行测试用例时都会附加旧的结果数据。

我使用 Beanshell 后处理器写入 CSV 文件。

import java.io.file;
import org.apache.jmeter.services.FileServer;

ActualResponseCode = prev.getResponseCode();


if (vars.get("ExpectedResponse").equals(vars.get("ActualResponse"))) 


if(vars.get("ExpectedResponseCode").equals(prev.getResponseCode()))
    
        prev.setSuccessful(true);
        Result = "Pass";
         ErrorMessage = "No Error"; 
               
    else
    
        Result = "Fail";
        ErrorMessage = "ResponseCode not matching";

    

   
else 

    prev.setSuccessful(false);
    Result = "Fail";
    ErrorMessage = "ResponseData is not matching";



f = new FileOutputStream("C://Users//a622821//Desktop//apache-jmeter-3.2//API_AUTOMATION//TestResult_Post.csv", true);

p = new PrintStream(f);
p.println(vars.get("TestCase") + "," + vars.get("API_Endpoint") + "," + vars.get("ExpectedResponseCode") + "," + ActualResponseCode + "," + Result + "," + ErrorMessage);

p.close();
f.close();

【问题讨论】:

你能添加你的文件创建代码(beanshell) 【参考方案1】:

基本上,当您写入文件时,您可以使用布尔值false 作为 FileWriter 构造函数的第二个参数来覆盖文件

File file = ....

new FileWriter(file, false);

如果您多次调用 beanshell,我建议创建 Beanshell 采样器,它将在测试开始时调用并覆盖文件(创建空文件):

import java.io.file;
f = new FileOutputStream("C://Users//a622821//Desktop//apache-jmeter-3.2//API_AUTOMATION//TestResult_Post.csv", false);

p = new PrintStream(f);    

p.close();
f.close();

如果你必须使用相同的 beanshell,你需要一个变量标志,所以添加变量 firstTime,值为 true

在 Beanshell 中使用它通过 firstTime 变量设置标志:

import java.io.file;
import org.apache.jmeter.services.FileServer;

ActualResponseCode = prev.getResponseCode();


if (vars.get("ExpectedResponse").equals(vars.get("ActualResponse"))) 


if(vars.get("ExpectedResponseCode").equals(prev.getResponseCode()))
    
        prev.setSuccessful(true);
        Result = "Pass";
         ErrorMessage = "No Error"; 
               
    else
    
        Result = "Fail";
        ErrorMessage = "ResponseCode not matching";

    

   
else 

    prev.setSuccessful(false);
    Result = "Fail";
    ErrorMessage = "ResponseData is not matching";


firstTime = vars.get("firstTime");

flag = true;
if ("true".equals(firstTime)) 
  flag = false;
  vars.put("firstTime", "false");

f = new FileOutputStream("C://Users//a622821//Desktop//apache-jmeter-3.2//API_AUTOMATION//TestResult_Post.csv", flag);


p = new PrintStream(f);
p.println(vars.get("TestCase") + "," + vars.get("API_Endpoint") + "," + vars.get("ExpectedResponseCode") + "," + ActualResponseCode + "," + Result + "," + ErrorMessage);

p.close();
f.close();

测试计划变量:

【讨论】:

我尝试过使用 new FileWriter(file, false);但它最重要的只是最后一个结果。我有 8 个测试用例,它只覆盖我的最后一个测试用例。其他测试用例结果未显示在文件中。 我在我的问题中添加了我的代码,我只使用了一个文件来编写所有测试用例结果 你能否分享更多细节我如何使用 beanshell 采样器进行多次调用 是的,我添加了值为 true 的变量 firstTime,但我的 csv 文件中没有写入任何内容 我已将您的代码添加到我的解决方案中。它在我的电脑上工作。我在测试计划组件中添加了变量【参考方案2】:

不要使用脚本向文件写入任何内容,JMeter 能够将任何内容存储到其 .jtl 结果文件中,因此我建议将其配置为在其中存储您需要的内容,而不是尝试在其中创建额外的结果文件这种奇怪的方式:

Beanshell 不是最好的脚本选项,如果您需要编写脚本,请考虑使用JSR223 Test Elements and Groovy language instead 如果您将某些内容写入文件,请确保将上述 JSR223 元素放在 Critical Section Controller 下

所以我建议切换到Response Assertion 或JSR223 Assertion 而不是后处理器。如果需要,您可以通过将下一行添加到 user.properties 文件(位于 JMeter 安装的“bin”文件夹中,但我认为它默认为 true in任何情况下)

jmeter.save.saveservice.assertion_results_failure_message=true

查看Scripting JMeter Assertions in Groovy - A Tutorial 了解更多详情。

【讨论】:

以上是关于如何使用 jmeter 覆盖 csv 文件中的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在jmeter中使用文件并读取数据

如何设置循环遍历CSV文件中每个值的jmeter测试?

jmeter能不能随机读取csv文件中的参数?

从 Jmeter 中的 CSV 文件中随机选择

Jmeter - 如何通过多个线程逐行读取 CSV 数据

如何使用Jmeter批量造数据?