groovy / jmeter - как конвертировать результаты массива - PullRequest
1 голос
/ 10 июня 2019

У меня есть этот заголовок в файле csv: TEST_ID; TEST_DESC; RQ_FIELD1; RQ_FIELD2; RQ_FIELD3; FIELD4; FIELD5; FIELD6; FIELD7; FIELD8

, и я использую это объявление для чтения его значений из csvв Jmeter Groovy:

String[] parameters = new String[]{vars.get("FIELD1"),vars.get("FIELD2"),vars.get("FIELD3")};

Затем я использовал значения из vars.get для создания моего запроса JSON.

Поскольку заголовок может меняться в зависимости от структуры csv, я бы хотелсоздать что-то динамическое, вместо использования объявления String[] parameters = new String[]{vars.get("FIELD1"),vars.get("FIELD2"),vars.get("FIELD3")};

Тогда я написал это:

public static String getFirstLine() throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(props.get("csvFilePath")));
    String line = br.readLine();
    br.close();
    return line;
}

    String line=getFirstLine();
    String[] header = new String[20];
    String[] parameters;
    int j=1;
    try {
        header = line.split(";");
        for (int i=1;i<header.length;i++){
          if (header[i].toString().contains("RQ_")){
            j++;
          }
        }
        parameters = new String[j];
        j=1;
        for (int i=1;i<header.length;i++){
          if (header[i].toString().contains("RQ_")){
            header[i] = header[i].toString().replaceAll("RQ_", "");
            header[i] = header[i].toString().trim();

            if (j!=parameters.length-1){
              parameters[j] = "vars.get(\""+header[i].toString()+"\"),";
            }
            else {


    parameters[j] = "vars.get(\""+header[i].toString()+"\")";
        }

        log.info ("====parameters.length["+parameters.length+"====header.length["+header.length+"]====i["+i+"]====j["+j+"]=====paramters["+parameters[j]+"]");
        j++;
      }

    }
    for (p=1;p<parameters.length;p++){
      log.info ("=====paramters["+parameters[p]+"]");
    }
  }catch (Exception e) {
  log.info(e.toString());
  log.info(result.sampleEnd());

}

вывод:

INFO o.a.j.m.JSR223PreProcessor: ====parameters.length[4====header.length[10]====i[2]====j[1]=====paramters[vars.get("FIELD1"),]
INFO o.a.j.m.JSR223PreProcessor: ====parameters.length[4====header.length[10]====i[3]====j[2]=====paramters[vars.get("FIELD2"),]
INFO o.a.j.m.JSR223PreProcessor: ====parameters.length[4====header.length[10]====i[4]====j[3]=====paramters[vars.get("FIELD3")]

Теперь я хотел быиспользовать параметры массива для чтения значений файла CSV:

String key;
for (String value : parameters) {
    key = "";
    if (value.length() > 0) {
    log.info("value["+value+"]);
    }
}

Я получил ошибку

javax.script.ScriptException: Sourced file: eval stream : Can't iterate over type: class bsh.Primitive : at Line: 81 : in file: eval stream : for ( String value : parameters ) { 
 in eval stream at line number 81
    at bsh.engine.BshScriptEngine.evalSource(BshScriptEngine.java:93) ~[bsh-2.0b6.jar:2.0b6 2016-02-05 05:16:19]
    at bsh.engine.BshScriptEngine.eval(BshScriptEngine.java:52) ~[bsh-2.0b6.jar:2.0b6 2016-02-05 05:16:19]
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:212) ~[?:1.8.0_181]
    at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:199) ~[ApacheJMeter_core.jar:4.0 r1823414]
    at org.apache.jmeter.modifiers.JSR223PreProcessor.process(JSR223PreProcessor.java:44) [ApacheJMeter_components.jar:4.0 r1823414]
    at org.apache.jmeter.threads.JMeterThread.runPreProcessors(JMeterThread.java:849) [ApacheJMeter_core.jar:4.0 r1823414]
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:467) [ApacheJMeter_core.jar:4.0 r1823414]
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:416) [ApacheJMeter_core.jar:4.0 r1823414]
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:250) [ApacheJMeter_core.jar:4.0 r1823414]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Из-за ошибки BshScriptEngine вы используете язык Beanshell / Java.

Для groovy измените поле языка на groovy в элементе JSR223

0 голосов
/ 10 июня 2019

Это не ответ на вопрос.

Это просто пример того, как вы можете прочитать простой CSV-файл в groovy:

def headers=null
new File('./test.csv').eachLine("UTF-8"){line->
    if(!headers){
        //split heaeders and do some modifications on header keys
        headers = line.split(';').collect{ it.replaceAll("RQ_","").trim() }
    }else{
        //split line to values
        def values = line.split(';')
        //convert values to map(header->value) to be able to access value by header
        def row = values.toList().withIndex().collectEntries{e-> [ headers[e[1]], e[0] ] }
        //at this point it's possible get value by header name
        log.info( row.FIELD1 )
    }
}

обратите внимание, что многие классы Java имеют дополнительные методы в groovy: http://docs.groovy -lang.org / latest / html / groovy-jdk /

например, массив объектов имеет метод collect (Closure)

, поэтому можно написать:

line.split(';').collect{ ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...