Jmeter, загрузка параметров теста из CSV файла.
#1
Отправлено 18 мая 2011 - 11:11
Существует следующий тест:
[PRE]
- доступные тестовые данные по ТС (марка-модель-модификация Транспортного средства)
[STEPS]
1. логин
2. переход на страницу
3. выбор константных значений
4. выбор марки, модели, модификации транспортного средства из конфигурационного файла.
5. .........
13. логаут
Тестовые данные забиты в файл cars.csv в следующем формате:
ACURA,MDX,3.5
ACURA,MDX,3.7
ACURA,RL,3.5
ALFA ROMEO,147,1.6
ALFA ROMEO,156,2.0
В тесте соответственно данные забираются через CSV Data Set Config.
при при прогоне теста с параметрами Thread Properties:
Number of Threads(users): 1
Loop Count: 1
тест работает отлично все данные из файла считываются верно.
При увеличение числа пользователей (Number of Threads(users): 10) начинается какая то мистика, то есть тест начинает падать с ошибками из-за того что допустим марка, модель берется из одной строчки файла, а модификация из другой и тест валится... :(
Как сделать так чтобы для большого числа пользователей данные из файла считывались корректно?
#2
Отправлено 18 мая 2011 - 18:23
Приаттачьте тест-план к сообщению форума - разберемся, чего там такое. А то на пальцах не понять...
Андрей Похилько
#3
Отправлено 18 мая 2011 - 18:57
Прикрепленные файлы
#4
Отправлено 19 мая 2011 - 09:51
Ну да... я могла чего-нибудь намудрить. Присоединяю тест и часть файла.
Мда. Очень интересный вопрос - зачем в BeanShell Assertion вы делаете __setProperty?
http://jakarta.apach.../functions.html тут написано в блоке варнинга
Наверное наводка отсюда - вы используете глобальные переменные (property), и они начинают друг друга перекрывать из разных тредов....properties are common to all threads...
Вообще Assertion предназначены для проверки наступления какого-либо условия после сделанного запроса. Если уж на то пошло, то вы должны были использовать для программирования BeanShell PostProcessor.
Но я не вижу необходимости в вашем тесте вообще BeanShell использовать... Жду ответ на мой вопрос про __setProperty
Андрей Похилько
#5
Отправлено 19 мая 2011 - 10:31
Мда. Очень интересный вопрос - зачем в BeanShell Assertion вы делаете __setProperty?
http://jakarta.apach.../functions.html тут написано в блоке варнингаНаверное наводка отсюда - вы используете глобальные переменные (property), и они начинают друг друга перекрывать из разных тредов....properties are common to all threads...
Вообще Assertion предназначены для проверки наступления какого-либо условия после сделанного запроса. Если уж на то пошло, то вы должны были использовать для программирования BeanShell PostProcessor.
Но я не вижу необходимости в вашем тесте вообще BeanShell использовать... Жду ответ на мой вопрос про __setProperty
:) BeanShell Assertion потому что другого решения не нашла...
Изначально была проблема что в тесте значения из списка (из select'а) выбираются по value
<option value="116" title="ACURA">ACURA</option>а значения в value эти значения берутся из базы и соответственно с каждой новой версией приложения эти значения могут меняться. Поэтому для выбора в интерфейса машинки я использую Xpath Extractor
//select[@id='calc_form:vehicle_mark']/option[text()='ACURA']/@value
но мне же нельзя все время выбирать одну машинку и название машинок надо брать из файла и тут у меня Xpath Extractor вообще отказался работать и пришли костыли из BeanShell Assertion.
я не знаю как заставить его выбирать значения машинок по другому
А не подскажите что вообще тогда использовать за место BeanShell?
#6
Отправлено 19 мая 2011 - 12:36
Вместо BeanShell стоит использовать Regular Expression Extractor и его фичу "0 for Random", или тот же Xpath Extractor. Если он как-то не работает - стоит разобраться с этим.
Второй путь - превратить BeanShell Assertion в BeanShell PostProcessor и вместо setProperty пользоваться vars.put(...), тогда вы вместо глобальных пропертей будете работать с локальными для тредов переменными и наводки уйдут.
http://en.wikipedia....rinciple#KISMIF ;)
Ваяйте и пишите что получается...
Андрей Похилько
#7
Отправлено 20 мая 2011 - 07:53
Xpath Extractor штука конечно строгая, но ресурсоемкая. Я бы посоветовал использовать вместо него Regular Expression Extractor. Но не суть сейчас.Вместо BeanShell стоит использовать Regular Expression Extractor и его фичу "0 for Random", или тот же Xpath Extractor. Если он как-то не работает - стоит разобраться с этим.Второй путь - превратить BeanShell Assertion в BeanShell PostProcessor и вместо setProperty пользоваться vars.put(...), тогда вы вместо глобальных пропертей будете работать с локальными для тредов переменными и наводки уйдут.http://en.wikipedia.org/wiki/KISS_principle#KISMIF ;)Ваяйте и пишите что получается...
C Regular Expression я как то все подружится не могу. Я когда использовала Xpath Extractor у меня было выражение такого плана:
//select[@id='calc_form:vehicle_mark']/option[text()='${markType}']/@valueТо есть ${markType} значение из файла.
Но вот нифига оно ему не нравилось совсем, может запись не правильная. Попробую тогда ещё раз BeanShell PostProcessor, я его пробовала но как то не сработало, ещё раз попробую. Спасибо за помощь)
#8
Отправлено 20 мая 2011 - 08:08
Конечно, запись не правильная. Что такое для XpathC Regular Expression я как то все подружится не могу. Я когда использовала Xpath Extractor у меня было выражение такого плана:
//select[@id='calc_form:vehicle_mark']/option[text()='${markType}']/@valueТо есть ${markType} значение из файла.
Но вот нифига оно ему не нравилось совсем, может запись не правильная
text()='${markType}'?
Надо было сначала выражение целиком получить, а потом ее использовать в экстракторе
#9
Отправлено 20 мая 2011 - 08:20
Конечно, запись не правильная. Что такое для Xpath
text()='${markType}'?
Надо было сначала выражение целиком получить, а потом ее использовать в экстракторе
Поэтому и использовала BeanShell Assertion.
#10
Отправлено 23 мая 2011 - 08:47
Что там, как идут дела?
Андрей Похилько
#11
Отправлено 23 мая 2011 - 13:49
Пинг-пинг!
Что там, как идут дела?
Не получается, не могу понять как записать значение в BeanShell PostProcessor.
#12
Отправлено 23 мая 2011 - 14:49
#13
Отправлено 24 мая 2011 - 08:35
//select[@id='calc_form:vehicle_mark']/option[text()='${markType}']/@value
при чем я удалили все BeanShell Assertion и BeanShell PostProcessor, оставила только Xpath Extractor.
Вопрос почему раньше это выражение не работало, так я и не поняла. Сейчас запускала тест под несколькими пользователями, ни разу не упал...
Предполагаю, что до этого просто не в том месте записывала Xpath Extractor, то есть данные из базы ещё не загрузились а я уже искала их Xpath Extractor'ом.
Но теперь мне интересно вот это :
Я обычно для чтения csv-файлов использую вот такую конструкцию ${__split(${__StringFromFile(cars.csv,,,)},var,\,)} . Можно создать внутри треда User Defined Variables и в него воткнуть эту функцию. В этом случае ваша строка разобьется на ${var_1}, ${var_2}, ${var_3} . Если нужно читать рандомно строки, то можно похимичить с функцией StringFromFile, указав рандомно начальную строку для чтения. Такой вариант работал стабильно, и "мистики", подобно вашей, замечено не было :)
Я создала User Defined Variables записала в нем это выражение только у меня другое выражение получилось:
${__split(${__StringFromFile(cars.csv,,,)},var,,)}и теперь я не понимаю как именно вытащить переменные ${var_3} и записать их в Xpath Extractor?
В том плане, как к этой переменной обращаться?
А ещё, может мне вообще не подходит этот вариант? Так как мне данный тест надо запускать не только под произвольным числом пользователей, но и произвольное число циклов. Я не очень понимаю как будет проходить чтение из файла.
Сообщение отредактировал ninfe@: 24 мая 2011 - 10:47
#14
Отправлено 24 мая 2011 - 11:02
Я не знаю как, но у меня заработало выражение:
//select[@id='calc_form:vehicle_mark']/option[text()='${markType}']/@value
при чем я удалили все BeanShell Assertion и BeanShell PostProcessor, оставила только Xpath Extractor.
Вопрос почему раньше это выражение не работало, так я и не поняла. Сейчас запускала тест под несколькими пользователями, ни разу не упал...
Предполагаю, что до этого просто не в том месте записывала Xpath Extractor, то есть данные из базы ещё не загрузились а я уже искала их Xpath Extractor'ом.
Но теперь мне интересно вот это :
Я обычно для чтения csv-файлов использую вот такую конструкцию ${__split(${__StringFromFile(cars.csv,,,)},var,\,)} . Можно создать внутри треда User Defined Variables и в него воткнуть эту функцию. В этом случае ваша строка разобьется на ${var_1}, ${var_2}, ${var_3} . Если нужно читать рандомно строки, то можно похимичить с функцией StringFromFile, указав рандомно начальную строку для чтения. Такой вариант работал стабильно, и "мистики", подобно вашей, замечено не было :)
Я создала User Defined Variables записала в нем это выражение только у меня другое выражение получилось:${__split(${__StringFromFile(cars.csv,,,)},var,,)}и теперь я не понимаю как именно вытащить переменные ${var_3} и записать их в Xpath Extractor?
В том плане, как к этой переменной обращаться?
А ещё, может мне вообще не подходит этот вариант? Так как мне данный тест надо запускать не только под произвольным числом пользователей, но и произвольное число циклов. Я не очень понимаю как будет проходить чтение из файла.
Мой пример был - это если вместо "CSV Data Set Config" использовать мой User Defined Variables. Тогда в сценарии вместо вашей переменной ${markType} можно использовать ${var_1}.
В выражении ${__split(${__StringFromFile(cars.csv,,,)},var,,)} нужно экранировать последнюю запятую, т.е. вот так сделать: ${__split(${__StringFromFile(cars.csv,,,)},var,\,)} иначе жметр будет ругаться на то, что в функции сплит 4 парамера указано, вместо 3-х.
Если у вас все заработало, то ок. Мой пример можно просто запомнить на будущее, как один из вариантов реализации чтения из csv файла.
#15
Отправлено 24 мая 2011 - 12:01
Мой пример был - это если вместо "CSV Data Set Config" использовать мой User Defined Variables. Тогда в сценарии вместо вашей переменной ${markType} можно использовать ${var_1}.
В выражении ${__split(${__StringFromFile(cars.csv,,,)},var,,)} нужно экранировать последнюю запятую, т.е. вот так сделать: ${__split(${__StringFromFile(cars.csv,,,)},var,\,)} иначе жметр будет ругаться на то, что в функции сплит 4 парамера указано, вместо 3-х.
Если у вас все заработало, то ок. Мой пример можно просто запомнить на будущее, как один из вариантов реализации чтения из csv файла.
Я вот и хочу на будущее попробовать.
Я исправила выражение и теперь при запуске у меня в логах пишется:
- jmeter.functions.StringFromFile: setParameters(cars.csv,,,)
- jmeter.functions.StringFromFile: Thread-68 Start = -2 Current = 1 End = -2
- jmeter.functions.StringFromFile: Thread-68 opening file cars.csv
ERROR - jmeter.functions.StringFromFile: openFile() error: java.io.FileNotFoundException:cars.csv (Не удается найти указанный файл)
почему он файл то не может найти...
#16
Отправлено 24 мая 2011 - 14:27
Мой пример был - это если вместо "CSV Data Set Config" использовать мой User Defined Variables. Тогда в сценарии вместо вашей переменной ${markType} можно использовать ${var_1}.
В выражении ${__split(${__StringFromFile(cars.csv,,,)},var,,)} нужно экранировать последнюю запятую, т.е. вот так сделать: ${__split(${__StringFromFile(cars.csv,,,)},var,\,)} иначе жметр будет ругаться на то, что в функции сплит 4 парамера указано, вместо 3-х.
Если у вас все заработало, то ок. Мой пример можно просто запомнить на будущее, как один из вариантов реализации чтения из csv файла.
Я вот и хочу на будущее попробовать.
Я исправила выражение и теперь при запуске у меня в логах пишется:
- jmeter.functions.StringFromFile: setParameters(cars.csv,,,)
- jmeter.functions.StringFromFile: Thread-68 Start = -2 Current = 1 End = -2
- jmeter.functions.StringFromFile: Thread-68 opening file cars.csv
ERROR - jmeter.functions.StringFromFile: openFile() error: java.io.FileNotFoundException:cars.csv (Не удается найти указанный файл)
почему он файл то не может найти...
Попробуйте написать полный путь до файла. Например ${__split(${__StringFromFile(/home/ninfe/cars.csv,,,)},var,\,)}
Где у вас лежит файл с марками, моделями и модификациями?
#17
Отправлено 25 мая 2011 - 06:08
Попробуйте написать полный путь до файла. Например ${__split(${__StringFromFile(/home/ninfe/cars.csv,,,)},var,\,)}
Где у вас лежит файл с марками, моделями и модификациями?
Да, спасибо, прописала полный путь, он заработал. Только он не сработал когда что то типа такого пишешь: "/home/ninfe/cars.csv", мне пришлось полный путь писать то есть D:\develop\Jmeter\cars.csv, хотя файл лежит в той же папке где и тест. Как то это не очень удобно, но не страшно.
И ещё как то странно чтение файла начинается не с первой строчки а где то с середины.
#18
Отправлено 14 сентября 2011 - 10:14
Если нужно читать рандомно строки, то можно похимичить с функцией StringFromFile, указав рандомно начальную строку для чтения.
В данной функции нет такой возможности указать начальную строку для чтения. И вообще в жеметре это сделать нельзя. Разве что с помощью beanshell.
Лучшим вариантом думаю будет зараннее рандомизировать данные в файле.
#19
Отправлено 13 октября 2017 - 07:26
Подскажите пожалуйста как JMeter настроить так что б он значение path конфига HTTP Request Defaults построчно брал из csv файла
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных