Добрый день, коллеги!
Столкнулся с проблемой, и не могу никак решить. Форум прочесал, похожих вопросов много, но не нашёл решения.
Суть проблемы:
Необходимо в 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();}