Jmeter как создать полезную нагрузку того же размера из файла csv с помощью итерации

#groovy #jmeter #jsr223

#groovy #jmeter #jsr223

Вопрос:

У меня был csv-файл, содержащий 10 идентификаторов пользователей, и требовалось создать полезную нагрузку для каждых 5 пользователей в csv. Ниже приведен мой код:

 def start    = (vars.get('__jm__Thread Group__idx') as int)
def offset   = 5
def payload  = [:]
def data     = []

def file     = 'C:/path/dataset.csv'
start.upto(offset, { index ->
    def lineFromCsv = new File(file).readLines().get(index)
    data.add(['userId': lineFromCsv.split(',')[0], 'groupId': lineFromCsv.split(',')[1]])
})

payload.put('data', data)
log.info("%%%The Payload is%%%:"   payload)
vars.put('payload', new groovy.json.JsonBuilder(payload).toPrettyString())
 

Мой 1-й вопрос: почему в первой полезной нагрузке (1-я итерация) было 6 элементов, тогда как я ожидал 5. И во 2-й полезной нагрузке (2-я итерация) было 5 элементов, как и ожидалось. Предполагалось, что в каждой полезной нагрузке должно быть одинаковое количество элементов.
Мой 2-й вопрос заключается в том, как мне заставить 2-ю полезную нагрузку начать разбор с того места, где остановилась 1-я полезная нагрузка. Предполагалось, что 2-я полезная нагрузка будет содержать следующие 5 пользователей в csv? Между каждой полезной нагрузкой не должно быть никаких элементов перекрытия.
Ниже приведена полезная нагрузка:
1-я полезная нагрузка:

 POST data:
{
    "data": [
        {
            "userId": "fakeUser3k0000002",
            "groupId": "1"
        },
        {
            "userId": "fakeUser3k0000003",
            "groupId": "2"
        },
        {
            "userId": "fakeUser3k0000004",
            "groupId": "2"
        },
        {
            "userId": "fakeUser3k0000005",
            "groupId": "3"
        },
        {
            "userId": "fakeUser3k0000006",
            "groupId": "4"
        },
        {
            "userId": "fakeUser3k0000007",
            "groupId": "5"
        }
    ]
}
 

2-я полезная нагрузка:

 POST data:
{
    "data": [
        {
            "userId": "fakeUser3k0000003",
            "groupId": "2"
        },
        {
            "userId": "fakeUser3k0000004",
            "groupId": "2"
        },
        {
            "userId": "fakeUser3k0000005",
            "groupId": "3"
        },
        {
            "userId": "fakeUser3k0000006",
            "groupId": "4"
        },
        {
            "userId": "fakeUser3k0000007",
            "groupId": "5"
        }
    ]
}
 

Ответ №1:

 def start    = (vars.get('__jm__Thread Group__idx') as int)
def offset   = 5
 

я думаю Thread Group , это ваше имя цикла jmeter.

вы должны построить цикл следующим образом

 (start*offset).step((start 1)*offset,1){ index->
    println it
}
 

итак, для start=5 вас будет индекс от 25 до 29

Комментарии:

1. start.upto((start * offset).step((start 1) * offset, 1), { index -> def lineFromCsv = new File(file).readLines().get(index) data.add(['userId': lineFromCsv.split(',')[0], 'groupId': lineFromCsv.split(',')[1]]) }) Я получил это исключение: javax.script.ScriptException: groovy.lang.missingmethod Исключение: нет подписи метода: java.lang. Integer.step() применим для типов аргументов: (целое число, целое число) значения: [5, 1]

2. используйте выражение, как я указал в ответе. нет upto.

Ответ №2:

  1. Чтобы получить 5 элементов в первой полезной нагрузке, вам необходимо определить смещение в 4 качестве __jm__Thread Group__idx значения переменной 0 во время первой итерации, вы можете проверить это с помощью отладочного сэмплера и просмотра комбинации прослушивателя дерева результатов
  2. Чтобы начать 2-ю итерацию с позиции 4 , вам нужно сохранить offset значение в переменной JMeter после построения первой полезной нагрузки и прочитать его во время 2-й итерации.