【问题标题】:Create Dynamic Json from csv using Groovy in Jmeter在 Jmeter 中使用 Groovy 从 csv 创建动态 Json
【发布时间】:2018-09-19 14:25:11
【问题描述】:

我正在尝试使用 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 中的参数 from 和 to 的 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 循环

【问题讨论】:

    标签: json groovy jmeter


    【解决方案1】:

    只需检查您如何使用JsonBuilder

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

    import groovy.json.JsonBuilder
    
    def builder = new JsonBuilder()
    
    builder({
        Rule{
            RuleId(0)
            Devices([1,2,3])
        }
    })
    println builder.toPrettyString()
    

    另一种方法是定义maps/arrays序列,然后转换成json

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

    【讨论】:

      【解决方案2】:

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

      您可以尝试使用以下代码生成您正在寻找的 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);
      

      更多信息:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-03
        • 1970-01-01
        • 2014-03-14
        相关资源
        最近更新 更多