如何使用 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 文件中的数据的主要内容,如果未能解决你的问题,请参考以下文章