Создайте динамический Json из CSV, используя Groovy в Jmeter

Я пытаюсь создать JSON с использованием данных CSV с использованием скриптов Groovy и передать то же самое в теле запроса в jmeter, но я не могу создать данные:

CSV Created:

0.0.0.0,255.255.255.255
10.0.0.1,255.0.0.0
10.0.0.2,255.0.0.1

Request body needed as :

{"Rule":{"__type":"AndroidSamsungDeviceRelocationRule","RuleId":0,"Name":"Test","DeviceFamily":6,"Targets":{"Groups":[{"Id":"0000000007.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000"}],"Devices":[]},"Priority":0,"IsEnabled":true,"StartDate":"/Date(1536856632768)/","EndDate":null,"Mappings":[{"RelocationTarget":{"Id":"0000000007.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000","Name":"100MB","Path":"\\\\100MB\\","PathVisible":"\\\\100MB\\"},"IPRange":[{"From":"0.0.0.0","To":"255.255.255.255"}...]}],"EnrollmentCertificateId":null,"EnrollmentCertificateName":""}}

Нужен IP-адрес для параметров от и до которых они находятся в csv в одном запросе.

код, который я пробовал это:

@Grab('com.xlson.groovycsv:groovycsv:1.3')
import static com.xlson.groovycsv.CsvParser.parseCsv

fh = new File('examples/data/process_csv_file.csv')
def csv_content = fh.getText('utf-8')

def data_iterator = parseCsv(csv_content, separator: ';', readFirstLine: true)

for (line in data_iterator) {
    sum = line[0] as String
    destination = line[1] as String
}

def builder = new groovy.json.JsonBuilder()

builder({
   Rule:{
      __type:"AndroidSamsungDeviceRelocationRule",
      RuleId:0,
      Name:"Test",
      DeviceFamily:6,
      Targets:{
         Groups:[
            {
               Id:"0000000007.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000"
            }
         ],
         Devices:[

         ]
      },
      Priority:0,
      IsEnabled:true,
      StartDate:"/Date(1536856632768)/",
      EndDate:null,
      Mappings:[
         {
            RelocationTarget:{
               Id:"0000000007.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000",
               Name:"100MB",
               Path:"\\\\100MB\\",
               PathVisible:"\\\\100MB\\"
            },
            IPRange:[
               {
                  "From":"sum",
                  "To":"destination"
               }
            ]
         }
      ],
      EnrollmentCertificateId:null,
      EnrollmentCertificateName:""
   }
})

sampler.getArguments().removeAllArguments()
sampler.addNonEncodedArgument('',builder.toPrettyString(),'')
sampler.setPostBodyRaw(true);   

Когда я запускаю это через препроцессор JSR223, я получаю пустой запрос с ошибкой HTTP 400.

Мне нужно создать динамический цикл IPRange для количества IP-адресов, доступных в CSV

2 ответа

Просто проверьте, как вы используете JsonBuilder

следующие два варианта дают одинаковый результат:

import groovy.json.JsonBuilder

def builder = new JsonBuilder()

builder({
    Rule{
        RuleId(0)
        Devices([1,2,3])
    }
})
println builder.toPrettyString()

Другой способ - определить последовательность карт / массивов, а затем преобразовать в json.

import groovy.json.JsonBuilder

def data = [
    Rule: [
        RuleId:0,
        Devices:[1,2,3]
    ]
]
println new JsonBuilder(data).toPrettyString()

Я не думаю, что вы можете использовать аннотацию @Grab в тестовых элементах JSR223, поэтому ваш тест не пройден в самом начале.

Вы можете попробовать использовать приведенный ниже код, который должен генерировать JSON, который вы ищете, без каких-либо внешних зависимостей:

def builder = new groovy.json.JsonBuilder()

@groovy.transform.Immutable
class IPRange {
    String From
    String To
}

def ipRanges = new File("examples/data/process_csv_file.csv").readLines().collect { line -> new IPRange(line.split(",")[0], line.split(",")[1]) }
builder.Rule(

        __type: "AndroidSamsungDeviceRelocationRule",
        RuleId: 0,
        Name: "Test",
        DeviceFamily: 6,
        Targets:
                [
                        Groups :
                                [
                                        [
                                                Id: "0000000007.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000",
                                        ]
                                ],
                        Devices:
                                [

                                ]
                ],
        Priority: 0,
        IsEnabled: true,
        StartDate: "/Date(1536856632768)/",
        EndDate: null,
        Mappings:
                [
                        [
                                RelocationTarget:
                                        [
                                                Id         : "0000000007.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000.0000000000",
                                                Name       : "100MB",
                                                Path       : "\\\\100MB\\",
                                                PathVisible: "\\\\100MB\\"
                                        ],
                                IPRange         : ipRanges.collect() {
                                    [
                                            From: it.From,
                                            To  : it.To
                                    ]
                                }

                        ]
                ],
        EnrollmentCertificateId: null,
        EnrollmentCertificateName: ""

)

sampler.getArguments().removeAllArguments()
sampler.addNonEncodedArgument('', builder.toPrettyString(), '')
sampler.setPostBodyRaw(true);

Дополнительная информация:

Другие вопросы по тегам