Java中嵌套Groovy语言debug调试测试

1. 编写测试脚本 (TestGroovy.groovy)

文件:image

内容:

import com.google.common.collect.Maps;

/**
 * @description: 大汉软件测试类
 * @author: gmj
 * @create: 2022-08-09
 * */

String test = test();
println("test: " + test);

HashMap<String, Object> map = Maps.newHashMap();
map.put("remark", "测试描述");
println(map);

Object remark = map.getOrDefault("remark", "110");
println(remark);

def date = new Date()
println "${date}"

static String test() {
    String str = "aaaaaaabbbbbbbbbb";
    String replace = str.replace("a", "");
    return replace;
}
2.测试类
import groovy.lang.GroovyShell;
import groovy.lang.Script;

import java.io.File;
import java.io.IOException;

/**
 * @description:
 * @author: gmj
 * @create: 2022-08-09
 **/
public class TestA {
    public static void main(String[] args) throws IOException {
        GroovyShell shell = new GroovyShell();
        File code = new File("D:\\测试脚本的目录\\TestGroovy.groovy");
        Script script = shell.parse(code);
        script.run();
    }
}
3.结果
test: bbbbbbbbbb
[remark:测试描述]
测试描述
Thu Sep 07 14:31:11 CST 2023
4.总结

本次测试的方式 Groovy的脚本在项目中可能是一个字符串(大多数),也可能是一个.groovy文件。

在项目中本人负责项目为了解决代码侵入性,Groovy的脚本相当于一个插件代码一样,预先编辑测试好存在数据库中,当调用具体逻辑的时候才会读取数据库具体配置。

这种方式导致一个致命的问题就是,一旦脚本写的过于繁重,成了定制化业务代码,后续维护、修改测试是最麻烦的。一旦项目需求变更就需要重新适配调试,如果当前脚本换一个人维护编辑测试的话,效率非常低下。

解决方法:在网上搜索了很长时间,总结最好的测试方式就是把Groovy脚本放在.groovy的文件中,把它当成java类,既可以实现debug调试,又可以实现快速的编辑测试。纯纯的高效率。

<think>好的,我现在需要解决用户在JMeter中使用FastJSON解析接口返回数据并编写断言脚本的问题。用户提供的JSON结构比较复杂,他们想获取reslist下的request_type和insuredList下的serialNo。首先,我需要仔细分析这个JSON结构,然后确定如何用FastJSON来提取这些字段。 首先,用户给出的JSON结构看起来是这样的:最外层是data对象,里面包含conlist数组,每个conlist元素有startDate和reslist数组。每个reslist元素里又有request_type、timestamp和insuredList数组。insuredList中的每个对象有serialNo、insuredAddress和email。此外,还有一个responseBody对象包含policyno。 用户的需求是获取reslist下的request_type和insuredList下的serialNo。可能需要遍历conlist中的每个元素,然后进入每个reslist,再处理其中的insuredList。这里需要确定是获取所有reslist的request_type,还是特定条件下的。同样,insuredList的serialNo是否需要全部提取? 接下来,我需要考虑如何在JMeter中使用JSR223断言来编写Java代码。JMeter的JSR223断言允许使用GroovyJava脚本,但用户提到要使用Java,所以可能需要用Groovy(因为JMeter的JSR223默认支持Groovy)。不过用户可能希望用Java语法,所以需要注意语法差异。 步骤可能是这样的: 1. 获取接口响应数据,通常使用prev.getResponseDataAsString()来获取。 2. 使用FastJSON的JSONObject.parseObject方法解析整个JSON字符串。 3. 逐层解析,先获取data对象,然后conlist数组,遍历每个conlist元素中的reslist数组。 4. 对于每个reslist元素,提取request_type。 5. 对于每个reslist中的insuredList数组,遍历并提取serialNo。 6. 将这些值存储到JMeter变量中,或者直接进行断言。 可能的代码结构: - 解析data对象:JSONObject data = jsonResponse.getJSONObject("data"); - 获取conlist数组:JSONArray conlist = data.getJSONArray("conlist"); - 遍历conlist中的每个元素,然后遍历每个元素的reslist数组。 - 在每个reslist元素中获取request_type,然后遍历insuredList获取serialNo。 需要注意的是,FastJSON的API调用是否正确,比如getJSONArray和getJSONObject的使用。另外,处理可能为null的情况,避免空指针异常。 用户可能还需要将这些提取的值进行断言,比如检查是否存在,或者是否符合预期值。因此,代码中可能需要将提取的值保存到JMeter变量中,或者直接在断言中比较。 例如,提取第一个reslist的第一个request_type,可以这样写: JSONObject firstCon = conlist.getJSONObject(0); JSONArray reslist = firstCon.getJSONArray("reslist"); String requestType = reslist.getJSONObject(0).getString("request_type"); 然后,对于insuredList: JSONArray insuredList = reslist.getJSONObject(0).getJSONArray("insuredList"); String serialNo = insuredList.getJSONObject(0).getString("serialNo"); 如果需要遍历所有conlist和reslist,则需要使用循环。例如: for (int i = 0; i < conlist.size(); i++) { JSONObject con = conlist.getJSONObject(i); JSONArray reslists = con.getJSONArray("reslist"); for (int j = 0; j < reslists.size(); j++) { JSONObject res = reslists.getJSONObject(j); String reqType = res.getString("request_type"); // 处理reqType,比如保存到变量或断言 JSONArray insureds = res.getJSONArray("insuredList"); for (int k = 0; k < insureds.size(); k++) { JSONObject insured = insureds.getJSONObject(k); String sNo = insured.getString("serialNo"); // 处理serialNo } } } 在JMeter的JSR223断言中,可能需要将上述代码放入,并确保脚本语言选择正确(比如Groovy),同时导入FastJSON的类。用户需要将FastJSON的jar包放入JMeter的lib目录,或通过其他方式引入。 可能遇到的问题包括:FastJSON的依赖是否正确加载,路径是否正确,以及数组越界的情况(比如某个reslist可能为空)。因此,代码中需要适当的异常处理或空值检查。 总结步骤: 1. 添加JSR223断言到HTTP请求。 2. 编写Java/Groovy代码解析响应JSON。 3. 使用FastJSON逐层获取所需字段。 4. 将获取的值进行断言或存储到变量。 最后,确保代码正确无误,处理多层级嵌套结构,并考虑所有可能的情况。</think>在JMeter中编写断言脚本获取多层嵌套JSON数据的步骤如下(使用FastJSON解析): 1. **添加JSR223断言** 右键HTTP请求 -> 添加 -> 断言 -> JSR223断言,语言选择`groovy` 2. **完整脚本代码** ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; // 获取响应数据 String response = prev.getResponseDataAsString(); try { // 解析JSON根节点 JSONObject root = JSON.parseObject(response); JSONObject data = root.getJSONObject("data"); // 获取conlist数组 JSONArray conlist = data.getJSONArray("conlist"); // 遍历每个conlist对象 for (int i = 0; i < conlist.size(); i++) { JSONObject conItem = conlist.getJSONObject(i); JSONArray reslist = conItem.getJSONArray("reslist"); // 遍历每个reslist对象 for (int j = 0; j < reslist.size(); j++) { JSONObject resItem = reslist.getJSONObject(j); // 获取request_type String requestType = resItem.getString("request_type"); log.info("找到request_type: " + requestType); // 获取insuredList数组 JSONArray insuredList = resItem.getJSONArray("insuredList"); // 遍历insuredList for (int k = 0; k < insuredList.size(); k++) { JSONObject insured = insuredList.getJSONObject(k); String serialNo = insured.getString("serialNo"); log.info("找到serialNo: " + serialNo); } } } // 示例断言:验证第一个request_type是否包含025704 if (!reslist.getJSONObject(0).getString("request_type").contains("025704")) { AssertionResult.setFailure(true); AssertionResult.setFailureMessage("request_type格式异常"); } } catch (Exception e) { log.error("JSON解析失败", e); AssertionResult.setFailure(true); AssertionResult.setFailureMessage("响应数据结构异常"); } ``` 3. **关键代码解析** $ \text{数据结构路径示意} $: $$ \begin{aligned} &\text{data} \\ &\quad \rightarrow \text{conlist[]} \\ &\qquad \rightarrow \text{reslist[]} \\ &\qquad\quad \rightarrow \text{request\_type} \\ &\qquad\quad \rightarrow \text{insuredList[]} \\ &\qquad\qquad \rightarrow \text{serialNo} \end{aligned} $$ 4. **注意事项** - 需要将fastjson的jar包放入`jmeter/lib`目录 - 使用`log.info()`调试时可查看jmeter.log - 多层数组必须使用嵌套循环遍历 - 建议添加try-catch处理空指针异常 5. **扩展应用** ```java // 将提取的值存入JMeter变量 vars.put("FIRST_REQUEST_TYPE", reslist.getJSONObject(0).getString("request_type")); // 断言所有email字段为空 insuredList.forEach(insured -> { if (!insured.getString("email").isEmpty()) { AssertionResult.setFailure(true); } }); ``` 建议通过`Debug Sampler`验证提取结果后再编写正式断言逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值