Перейти к содержимому

Фотография

Как указать относительный путь в BeanShell Post Processor?

JMeter BeanShell relative_path path

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 5

#1 Trash_Polka

Trash_Polka

    Новый участник

  • Members
  • Pip
  • 4 сообщений
  • ФИО:Роман Николаевич

Отправлено 02 апреля 2021 - 12:19

Добрый день, коллеги! 
Столкнулся с проблемой, и не могу никак решить. Форум прочесал, похожих вопросов много, но не нашёл решения. 

Суть проблемы: 
Необходимо в BeanShell Post Processor добавить относительный путь к файлу, куда будет положена data. 

=============================================================================================

Вот код в самом пост-процессоре: 

Entrylogin = vars.get("Entrylogin");
Entrypass = vars.get("Entrypass");
f = new FileOutputStream(
"${project_folder}/app_EntryData.csv", false); // Вот на этой строчке вылезает ошибка. 
p = new PrintStream(f); 
this.interpreter.setOut(p); 
print(Entrylogin + "," + Entrypass);
f.close();
Прикрепленный файл  код.JPG   50,97К   0 Количество загрузок:   
Ошибка : 
ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``Entrylogin = vars.get("Entrylogin"); Entrypass = vars.get("Entrypass");  f = new . . . '' Token Parsing Error: Lexical error at line 5, column 13.  Encountered: "J" (74), after : "\"C:\\"
 
WARN o.a.j.e.BeanShellPostProcessor: Problem in BeanShell script: org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``Entrylogin = vars.get("Entrylogin"); Entrypass = vars.get("Entrypass");  f = new . . . '' Token Parsing Error: Lexical error at line 5, column 13.  Encountered: "J" (74), after : "\"C:\\"
=============================================================================================
Я создал переменную в User Defined Variables:
Прикрепленный файл  Variable.JPG   15,27К   0 Количество загрузок:
Вот что в ней лежит если наступить в Debug Sampler:
Прикрепленный файл  Debug Sampler.jpg   8,07К   0 Количество загрузок:
Я пробовал делать .replace  (Например .replace('\\', '/'), вообще тучу вариантов перебрал, и с ковычками и со всем чем можно) , чет не помогает, будто дело до .replace и не доходит, ловит ошибку от сслыки на переменную и всё тут. 

=============================================================================================

Если у Вас есть идеи, подскажите пожалуйста, заранее благодарен! 
P.S.: Если это легче реализовать через JSR223 PostProcessor + groovy, буду также благодарен, если подскажите как это сделать. 


  • 0

#2 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 897 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 02 апреля 2021 - 14:38

Ребят, в этих пост-процессоров нет норм дебага, поэтому обязательные правила:

 

1. Когда вы получаете значения переменных - ВСЕГДА их логируйте, это правило номер 1

2. Весь код ВСЕГДА пишите в IDE - вот всегда, а потом уже переносите в JMeter

3. Вам КАК минимум необходимо сделать импорт и обернуть в try/catch

 

 

 

import java.io.FileInputStream;

import java.io.FileNotFoundException;

 

try {

FileInputStream fin=new FileInputStream("xxxxxxxxxx");
} catch (FileNotFoundException e) {
e.printStackTrace();
}

 

4. Всегда просто выводите на консоль ${project_folder}, там может русские символы или еще что-то - см. пункт 1

5. Если НЕ работает, то ВСЕГДА пишите код по частям, находя где может быть ошибка


  • 1

#3 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 02 апреля 2021 - 16:35

"${project_folder}\app_EntryData.csv", false)

а так?


  • 0

#4 Trash_Polka

Trash_Polka

    Новый участник

  • Members
  • Pip
  • 4 сообщений
  • ФИО:Роман Николаевич

Отправлено 05 апреля 2021 - 08:48

Ребят, в этих пост-процессоров нет норм дебага, поэтому обязательные правила:

 

1. Когда вы получаете значения переменных - ВСЕГДА их логируйте, это правило номер 1

2. Весь код ВСЕГДА пишите в IDE - вот всегда, а потом уже переносите в JMeter

3. Вам КАК минимум необходимо сделать импорт и обернуть в try/catch

 

 

 

import java.io.FileInputStream;

import java.io.FileNotFoundException;

 

try {

FileInputStream fin=new FileInputStream("xxxxxxxxxx");
} catch (FileNotFoundException e) {
e.printStackTrace();
}

 

4. Всегда просто выводите на консоль ${project_folder}, там может русские символы или еще что-то - см. пункт 1

5. Если НЕ работает, то ВСЕГДА пишите код по частям, находя где может быть ошибка

Спасибо большое за правила, обязательно буду их учитывать в дальнейшем!
К сожалению, это всё периферийные замечания к коду. Проблему блок try/catch не решает, и добавленные библиотеки тоже. 

На сколько я понял (поправьте, если это не так), проблема в том, что в переменной лежит функция ${__BeanShell (...)},  а в пост процессоре BeanShellInterpreter может интерпретировать эту функцию по своему. из-за этого он воспринимает данные в переменной не как стринговые например, а по другому. 
==================================================
Я пытался вывести переменную ${project_folder} в консоль : 

System.out.println ("project_folder = " + ${project_folder}); или + vars.get ( ${project_folder})); или + props.get ( ${project_folder})); 

, но в консоль она попросту не выводится, а в логах всё та же ошибка:

2021-04-05 11:41:38,764 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval In file: inline evaluation of: ``import java.io.FileInputStream; import java.io.FileNotFoundException;    Entrylo . . . '' Encountered "( \"project_folder = \" + C :" at line 8, column 20.

  • 0

#5 Trash_Polka

Trash_Polka

    Новый участник

  • Members
  • Pip
  • 4 сообщений
  • ФИО:Роман Николаевич

Отправлено 05 апреля 2021 - 08:52

"${project_folder}\app_EntryData.csv", false)

а так?

 

Не)) символ \ используется, чтобы "ескейпить" другие, например, системные символы, если это необходимо. 


  • 0

#6 Trash_Polka

Trash_Polka

    Новый участник

  • Members
  • Pip
  • 4 сообщений
  • ФИО:Роман Николаевич

Отправлено 07 апреля 2021 - 06:58

Добрый день, коллеги! 
Столкнулся с проблемой, и не могу никак решить. Форум прочесал, похожих вопросов много, но не нашёл решения. 

Суть проблемы: 
Необходимо в BeanShell Post Processor добавить относительный путь к файлу, куда будет положена data. 

=============================================================================================

Вот код в самом пост-процессоре: 

Entrylogin = vars.get("Entrylogin");
Entrypass = vars.get("Entrypass");
f = new FileOutputStream(
"${project_folder}/app_EntryData.csv", false); // Вот на этой строчке вылезает ошибка. 
p = new PrintStream(f); 
this.interpreter.setOut(p); 
print(Entrylogin + "," + Entrypass);
f.close();
Ошибка : 
ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``Entrylogin = vars.get("Entrylogin"); Entrypass = vars.get("Entrypass");  f = new . . . '' Token Parsing Error: Lexical error at line 5, column 13.  Encountered: "J" (74), after : "\"C:\\"
 
WARN o.a.j.e.BeanShellPostProcessor: Problem in BeanShell script: org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``Entrylogin = vars.get("Entrylogin"); Entrypass = vars.get("Entrypass");  f = new . . . '' Token Parsing Error: Lexical error at line 5, column 13.  Encountered: "J" (74), after : "\"C:\\"
=============================================================================================
Я создал переменную в User Defined Variables:
Вот что в ней лежит если наступить в Debug Sampler:
Я пробовал делать .replace  (Например .replace('\\', '/'), вообще тучу вариантов перебрал, и с ковычками и со всем чем можно) , чет не помогает, будто дело до .replace и не доходит, ловит ошибку от сслыки на переменную и всё тут. 

=============================================================================================

Если у Вас есть идеи, подскажите пожалуйста, заранее благодарен! 
P.S.: Если это легче реализовать через JSR223 PostProcessor + groovy, буду также благодарен, если подскажите как это сделать. 

==================================

В общем решил я свою проблему, да сразу тремя способами) 
Напишу что сделал на случай, если кто-то столкнётся с подобной. 

От ссылки на переменную в виде ${variable_name} необходимо отказаться, если вы используете BeanShell и JSR223 сэмплеры/постпроцессоры/препроцессоры. 
Необходимо объявить новую переменную и присвоить ей значение той, которая Вам нужна, в виде: 

Для BeanShell элементов:

variable_new = vars.get ("variable_name"); - Без ссылки в формате ${...}, и в обычных ковычках работает замечательно. 

Для JSR223 + groovy: 

def variable_new = vars.get ("variable_name"); - различия минимальны)
 

Вот два варианта реализации в BeanShell: 
Вариант 1: Необходимо обратиться к папке где лежит файл внутри кода.
path = FileServer.getFileServer().getBaseDir(); // Это позволит положить в переменную путь и в дальнейшем использовать его.

Вариант 2: Объявить переменную и взять значение из другой (в моем случае объявленной в User Def. Variables).

path = vars.get ("project_folder"); // Далее можно использовать переменную path -  в ней будет лежать путь, до вашего проекта. (При условии, что он лежит в переменной project_folder)

 

Вариант реализации для JSR223 + groovy:

Всё очень просто, перед переменной, которой мы хотим присвоить путь до репозитория, мы пишем def 

def path = FileServer.getFileServer().getBaseDir(); 

def path = vars.get ("project_folder");

Также рекомендую для большей автоматизации добавить системный разделитель (forward slash) / или (back slash) \  в переменную, и использовать её, а не символы / и \. Это необходимо для кроссплатформенности. Чтобы ваш сценарий можно было запустить и на macOS и на Linux и на Windows, т.к. системные разделители (File.separator) у них разные. 
s = File.separator; //Для BeanShell                     и             def s= File.separator; // Для JSR223+groovy. 

==============================================================================

Далее напишу код, для записи в файл через JSR223+groovy, он немного отличается от моей реализации в BeanShell, если вдруг кому-то будет нужна запись в файл именно через JSR223+groovy.
 

import java.lang.*
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import org.apache.jmeter.services.FileServer;
import java.util.*
import groovy.lang.*
import groovy.util.*                         
 
def path = vars.get ("project_folder");      // Один вариант реализации
def s = File.separator;
def Entrylogin = vars.get("Entrylogin");
def Entrypass = vars.get("Entrypass");
 
//def path = FileServer.getFileServer().getBaseDir();       // Второй вариант реализации
 
try{
FileWriter fstream = new FileWriter(
path+"data"+s+"app_EntryData.csv" , false);     // В моей переменной project_folder в конце уже лежит функция File.separator в User Def. Variables, поэтому я использую переменную s только один раз. 
fstream.write(Entrylogin + "," + Entrypass+"\n");
fstream.close(); 
} catch (FileNotFoundException e) {e.printStackTrace();}

  • 0



Темы с аналогичным тегами JMeter, BeanShell, relative_path, path

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных