在Jmeter中使用Groovy从csv创建Dynamic Json

时间:2018-09-18 16:21:32

标签: json groovy jmeter

我正在尝试使用Groovy脚本使用CSV数据创建json,并将其传递到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":""}}

在单个请求中,需要csv中的参数的IP地址。

我尝试过的

代码是:

@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。

我需要为CSV中可用IP的数量创建一个动态IPRange循环

2 个答案:

答案 0 :(得分:0)

只需检查您如何使用1-TEST-PIPPO,PLUTO-PLUTO

以下两个变体产生相同的结果:

select t1.name, t1.date, t2.date date2, t1.active
from  (
    select distinct name, date from [table] where active = 'Y'
)  t1
cross apply (
     select top 5 date 
     from [table] 
     where active = 'Y' and name = t1.name and date <= t1.date
     order by date desc
) t2
order by name, date, date2

另一种方法是定义映射/数组序列,然后转换为json

JsonBuilder

答案 1 :(得分:0)

我认为您不能在@Grab中使用JSR223 Test Elements注释,因此您的测试在一开始就失败了。

您可以尝试使用下面的代码,这些代码应生成您要查找的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);

更多信息: