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

Техники локализации плавающих дефектов
онлайн, начало 19 апреля
Тестирование безопасности
онлайн, начало 21 апреля
Тестирование мобильных приложений
онлайн, начало 21 апреля
Автоматизатор мобильных приложений
онлайн, начало 21 апреля
Фотография

Как указать относительный путь в 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
  • 854 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 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
  • 817 сообщений


Отправлено 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)
онлайн
Тестирование удобства использования
онлайн
Тестирование REST API
онлайн
Тестирование веб-приложений 2.0
онлайн




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

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

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

Яндекс.Метрика
Реклама на портале