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

Фотография

Jmeter, загрузка параметров теста из CSV файла.


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

#1 ninfe@

ninfe@

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

  • Members
  • Pip
  • 51 сообщений
  • Город:Калуга


Отправлено 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) начинается какая то мистика, то есть тест начинает падать с ошибками из-за того что допустим марка, модель берется из одной строчки файла, а модификация из другой и тест валится... :(

Как сделать так чтобы для большого числа пользователей данные из файла считывались корректно?
  • 0

#2 APC

APC

    Опытный участник

  • Members
  • PipPipPipPip
  • 293 сообщений
  • ФИО:Похилько Андрей Федорович
  • Город:Москва


Отправлено 18 мая 2011 - 18:23

Читалка CSV в ЖМетре достаточно надежная штука. Скорее всего что-то не так у вас в тесте.
Приаттачьте тест-план к сообщению форума - разберемся, чего там такое. А то на пальцах не понять...
  • 0

#3 ninfe@

ninfe@

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

  • Members
  • Pip
  • 51 сообщений
  • Город:Калуга


Отправлено 18 мая 2011 - 18:57

Ну да... я могла чего-нибудь намудрить. Присоединяю тест и часть файла.

Прикрепленные файлы


  • 0

#4 APC

APC

    Опытный участник

  • Members
  • PipPipPipPip
  • 293 сообщений
  • ФИО:Похилько Андрей Федорович
  • Город:Москва


Отправлено 19 мая 2011 - 09:51

Ну да... я могла чего-нибудь намудрить. Присоединяю тест и часть файла.


Мда. Очень интересный вопрос - зачем в BeanShell Assertion вы делаете __setProperty?
http://jakarta.apach.../functions.html тут написано в блоке варнинга

...properties are common to all threads...

Наверное наводка отсюда - вы используете глобальные переменные (property), и они начинают друг друга перекрывать из разных тредов.

Вообще Assertion предназначены для проверки наступления какого-либо условия после сделанного запроса. Если уж на то пошло, то вы должны были использовать для программирования BeanShell PostProcessor.

Но я не вижу необходимости в вашем тесте вообще BeanShell использовать... Жду ответ на мой вопрос про __setProperty
  • 0

#5 ninfe@

ninfe@

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

  • Members
  • Pip
  • 51 сообщений
  • Город:Калуга


Отправлено 19 мая 2011 - 10:31

Мда. Очень интересный вопрос - зачем в BeanShell Assertion вы делаете __setProperty?
http://jakarta.apach.../functions.html тут написано в блоке варнинга

...properties are common to all threads...

Наверное наводка отсюда - вы используете глобальные переменные (property), и они начинают друг друга перекрывать из разных тредов.

Вообще 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.
я не знаю как заставить его выбирать значения машинок по другому :blush:

А не подскажите что вообще тогда использовать за место BeanShell?
  • 0

#6 APC

APC

    Опытный участник

  • Members
  • PipPipPipPip
  • 293 сообщений
  • ФИО:Похилько Андрей Федорович
  • Город:Москва


Отправлено 19 мая 2011 - 12:36

Xpath Extractor штука конечно строгая, но ресурсоемкая. Я бы посоветовал использовать вместо него Regular Expression Extractor. Но не суть сейчас.

Вместо BeanShell стоит использовать Regular Expression Extractor и его фичу "0 for Random", или тот же Xpath Extractor. Если он как-то не работает - стоит разобраться с этим.

Второй путь - превратить BeanShell Assertion в BeanShell PostProcessor и вместо setProperty пользоваться vars.put(...), тогда вы вместо глобальных пропертей будете работать с локальными для тредов переменными и наводки уйдут.

http://en.wikipedia....rinciple#KISMIF ;)

Ваяйте и пишите что получается...
  • 0

#7 ninfe@

ninfe@

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

  • Members
  • Pip
  • 51 сообщений
  • Город:Калуга


Отправлено 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, я его пробовала но как то не сработало, ещё раз попробую. Спасибо за помощь)
  • 0

#8 enki86

enki86

    Постоянный участник

  • Members
  • PipPipPip
  • 231 сообщений


Отправлено 20 мая 2011 - 08:08

C Regular Expression я как то все подружится не могу. Я когда использовала Xpath Extractor у меня было выражение такого плана:

//select[@id='calc_form:vehicle_mark']/option[text()='${markType}']/@value
То есть ${markType} значение из файла.

Но вот нифига оно ему не нравилось совсем, может запись не правильная

Конечно, запись не правильная. Что такое для Xpath
text()='${markType}'
?
Надо было сначала выражение целиком получить, а потом ее использовать в экстракторе
  • 0

#9 ninfe@

ninfe@

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

  • Members
  • Pip
  • 51 сообщений
  • Город:Калуга


Отправлено 20 мая 2011 - 08:20

Конечно, запись не правильная. Что такое для Xpath

text()='${markType}'
?
Надо было сначала выражение целиком получить, а потом ее использовать в экстракторе



Поэтому и использовала BeanShell Assertion.
  • 0

#10 APC

APC

    Опытный участник

  • Members
  • PipPipPipPip
  • 293 сообщений
  • ФИО:Похилько Андрей Федорович
  • Город:Москва


Отправлено 23 мая 2011 - 08:47

Пинг-пинг!

Что там, как идут дела?
  • 0

#11 ninfe@

ninfe@

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

  • Members
  • Pip
  • 51 сообщений
  • Город:Калуга


Отправлено 23 мая 2011 - 13:49

Пинг-пинг!

Что там, как идут дела?


Не получается, не могу понять как записать значение в BeanShell PostProcessor.
  • 0

#12 ligreen

ligreen

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

  • Members
  • Pip
  • 52 сообщений

Отправлено 23 мая 2011 - 14:49

Я обычно для чтения csv-файлов использую вот такую конструкцию ${__split(${__StringFromFile(cars.csv,,,)},var,\,)} . Можно создать внутри треда User Defined Variables и в него воткнуть эту функцию. В этом случае ваша строка разобьется на ${var_1}, ${var_2}, ${var_3} . Если нужно читать рандомно строки, то можно похимичить с функцией StringFromFile, указав рандомно начальную строку для чтения. Такой вариант работал стабильно, и "мистики", подобно вашей, замечено не было :)
  • 0

#13 ninfe@

ninfe@

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

  • Members
  • Pip
  • 51 сообщений
  • Город:Калуга


Отправлено 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

  • 0

#14 ligreen

ligreen

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

  • Members
  • Pip
  • 52 сообщений

Отправлено 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 файла.
  • 0

#15 ninfe@

ninfe@

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

  • Members
  • Pip
  • 51 сообщений
  • Город:Калуга


Отправлено 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 (Не удается найти указанный файл)

почему он файл то не может найти...
  • 0

#16 ligreen

ligreen

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

  • Members
  • Pip
  • 52 сообщений

Отправлено 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,\,)}
Где у вас лежит файл с марками, моделями и модификациями?
  • 0

#17 ninfe@

ninfe@

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

  • Members
  • Pip
  • 51 сообщений
  • Город:Калуга


Отправлено 25 мая 2011 - 06:08

Попробуйте написать полный путь до файла. Например ${__split(${__StringFromFile(/home/ninfe/cars.csv,,,)},var,\,)}
Где у вас лежит файл с марками, моделями и модификациями?



Да, спасибо, прописала полный путь, он заработал. Только он не сработал когда что то типа такого пишешь: "/home/ninfe/cars.csv", мне пришлось полный путь писать то есть D:\develop\Jmeter\cars.csv, хотя файл лежит в той же папке где и тест. Как то это не очень удобно, но не страшно.

И ещё как то странно чтение файла начинается не с первой строчки а где то с середины.
  • 0

#18 fesd

fesd

    Опытный участник

  • Members
  • PipPipPipPip
  • 262 сообщений

Отправлено 14 сентября 2011 - 10:14

Если нужно читать рандомно строки, то можно похимичить с функцией StringFromFile, указав рандомно начальную строку для чтения.


В данной функции нет такой возможности указать начальную строку для чтения. И вообще в жеметре это сделать нельзя. Разве что с помощью beanshell.
Лучшим вариантом думаю будет зараннее рандомизировать данные в файле.
  • 0

#19 emptyxl

emptyxl

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

  • Members
  • Pip
  • 1 сообщений

Отправлено 13 октября 2017 - 07:26

Подскажите пожалуйста как JMeter настроить так что б он значение path конфига HTTP Request Defaults построчно брал из csv файла


  • 0


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

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