Jmeter清除每次运行的resultFile

时间:2018-10-24 05:51:19

标签: jmeter

我有一个测试计划,其中有两个线程组,第一个线程组将运行,并将结果记录到文件中,记录的文件将作为第二个线程组的输入。 现在,为了在线程组一中执行此操作,我如下添加了BeanShell PostProcessor脚本,但是它的工作原理如下

  1. 打开jmeter并运行测试计划(日志文件“ testing.csv”将被重新创建)
  2. 第一次,“ isHeaderWritten”属性为false。
  3. 否,如果不关闭并重新打开jmeter,请再次运行脚本。我希望日志文件“ testing.csv”必须被截断并重新添加值。但是实际发生的是“ testing.csv”文件附加了新值。
  4. 现在,关闭jmeter并再次打开,这次日志文件“ testing.csv”将被截断并添加新的新值。

如何清除文件并为每次运行重写记录(不关闭jemeter)

import org.apache.jmeter.util.JMeterUtils;

threadName=ctx.getThread().getThreadName();
log.info("threadName: "+threadName);

isHeaderWritten = JMeterUtils.getPropDefault("isHeaderWritten","false");
 fileName="C:\\response\\testing.csv";
log.info("isHeaderWritten: "+isHeaderWritten);
if(isHeaderWritten == "true"){  
    f = new FileOutputStream(fileName, true);   
    fileHeader = "requestStatus,cNumber,pId,id,token";
}else{
    log.error("isHeaderWritten:"+isHeaderWritten);
    f = new FileOutputStream(fileName, false);
    fileHeader = "requestStatus,cNumber,pId,id,token";
}
p = new PrintStream(f); 
this.interpreter.setOut(p); 
if(isHeaderWritten == "false"){ 
    print(fileHeader);  
    JMeterUtils.setProperty("isHeaderWritten", "true");
}
log.info("Test results will be written to file "+fileName);

cNumber=vars.get("cNumber");
log.info("cNumber"+cNumber);
pId = vars.get("pId");
log.info("pId"+pId);
pmId = vars.get("pmId");
log.info("pmId"+pmId);
tTxt = vars.get("tTxt");
log.info("tTxt"+tTxt);

responseCode=prev.getResponseCode();
log.info("responseCode  of "+requestString+ " is "+responseCode);
requestStatus = "Success";
if(!"201".equals(responseCode)){
    requestStatus = "Failure"+","+cNumber+","+pId+","+pmId+","+tTxt;
}
result = requestStatus;
if("Success".equals(requestStatus)){

    responseData=new String(data);
    log.info("responseData  of "+requestString+ " is "+responseData);
    requestString=requestStatus+","+cNumber+","+pId+","+pmId+","+tTxt;
    result = requestString;
    log.info("result"+result);
}
log.debug(result);
print(result);
f.close();

1 个答案:

答案 0 :(得分:0)

根据JMeter Documentation

  

属性是JMeter的全局属性,因此可用于在线程和线程组之间进行通信

     

属性与变量不同。变量是线程本地的;属性是所有线程共有的

因此,一旦执行此行:

JMeterUtils.setProperty("isHeaderWritten", "true");

属性isHeaderWritten将变为true,并且将保持true直到重新启动JMeter。

最简单的解决方案是在测试计划中添加tearDown Thread Group(正在其他线程组之后执行此线程组)并添加JSR223 Sampler使用以下代码:

SampleResult.setIgnore();
org.apache.jmeter.util.JMeterUtils.setProperty("isHeaderWritten", "false");

Since JMeter 3.1 users are encouraged to switch to JSR223 Test Elements and Groovy language用于任何形式的脚本,主要是因为Groovy performance is much better than Beanshell,因此请考虑在下一个可用机会时迁移到JSR223 PostProcessor和Groovy语言