【问题标题】:How can I overwrite data in csv file using jmeter如何使用 jmeter 覆盖 csv 文件中的数据
【发布时间】: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)

标签: jmeter


【解决方案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 结果文件中,因此我建议将其配置为在其中存储您需要的内容,而不是尝试在其中创建额外的结果文件这种奇怪的方式:


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

jmeter.save.saveservice.assertion_results_failure_message=true

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2013-12-28
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多