Jmeter进行数据库数据校验断言

数据库断言

数据库驱动配置步骤

  1. 添加驱动包。点击测试计划,找到库配置,点击“浏览”配置驱动包。

    image-20210205190753655

  2. 添加数据库配置元件。右键测试计划或者线程组,点击添加,选择JDBC Connection Configuration

    Variable Name For created pool:数据库配置的环境变量名字。这里先配置为db。

    Database URL:数据库连接URL。

    JDBC Driver Class:数据库驱动类名。右边可以下拉选择。

    Username:数据库用户名。

    Password:数据库密码。

    Connection Properties:数据库连接属性。这里可以不配置。

    image-20210205191916429

  3. 点击添加取样器,选择jdbc request

    image-20210205192452474

  4. 输入sql,启动测试用例即可查询到数据。

    image-20210205192531986

增加断言

jmeter的断言有很多中,数据库请求所有的断言都可以用。如果只是简单的比较结果是否等于或者包含某个值,使用比较断言接口。但是如果需要对不同的字段进行比较,则需要使用BeanShell断言。

  1. jdbc request下添加BeanShell断言。

  2. 写一个java脚本,用于比较数据。

    public class JmeterCheckUtils {
        public static void checkResult() {
          	// 返回数据为空,直接校验失败
          	if (vars.getObject("result").size() == 0) {
                Failure = true;
                FailureMessage = "查询结果为空";
                return;
            }  
            // 取第一个结果
            Result = vars.getObject("result").get(0);
            TreeMap treeMap = new TreeMap(Result);
            log.info("期望值:" + map.toString());
            log.info("实际值:" + treeMap.toString());
            String resultValue = "";
            String expectedValue = "";
            boolean result = false;
            StringBuilder message = new StringBuilder("\n");
            for (String key : map.keySet()) {
                expectedValue = map.get(key);
                resultValue = Result.get(key) == null ? null : Result.get(key).toString();
                if (resultValue == null) {
                    // 这里是为了兼容oracle返回的字段都是大写的。
                    resultValue = Result.get(key.toUpperCase()) == null ? null : Result.get(key.toUpperCase()).toString();
                }
                if (expectedValue != null && expectedValue.startsWith("$")) {
                    expectedValue = vars.get(expectedValue.substring(2, expectedValue.length() - 1));
                }
    
                if (expectedValue == null) {
                    result = expectedValue != resultValue;
                } else {
                    result = !expectedValue.equals(resultValue);
                }
    
                if (result) {
                    Failure = true;
                    message.append(key + "的实际值为【" + resultValue + "】; " + key + "的期望值为【" + expectedValue + "】; " + "校验结果为:" + (result ? "不通过" : "通过") + ";\n");
                }
            }
            log.info(message.toString());
            FailureMessage = message.toString();
        }
    }
    

    脚本说明:

    1. 这里是取数据库请求返回的第一条数据(取不到则校验失败),放到实际值map对象中,与BeanShell中定义的期望值map对象进行比较。可以根据自己的测试场景进行改造。
    2. 期望值可以写成${param}的形式,脚本会判断$开头的期望值,到环境变量中取。
    3. FailureMessage、log、Result、Failure都是jmeter的预置的变量,不需要重新定义。
    4. 定义Map对象的时候,不能写尖括号(不清楚原理,应该是不支持泛型)。
    5. 使用TreeMap是为了打印期望值与实际值时,参数名字保持顺序,方便肉眼查看。
    6. 数据库请求的返回结果需要赋值到result变量中。
  3. 在BeanShell中填写脚本。

    // 引入上面的java脚本,参数是java文件的源代码路径。
    source("/Users/JmeterCheckUtils.java");
    // 定义期望值map对象
    Map map = new TreeMap();
    // 填写期望值,这里设置成错误的值,方便查看结果。
    map.put("TABLESPACE_NAME", "SYSTEM1");
    // 调用java脚本比较期望值
    JmeterCheckUtils.checkResult();
    
  4. 查看结果。可以看到期望值是SYSTEM1,而查询到的结果是SYSTEM。

    BeanShell断言说明:

    Assertion error:脚本是否有运行异常,如果有则需要看日志排查。
    Assertion failure: 断言结果是否为失败。关联的对象是Failure。
    Assertion failure message:断言的错误信息。关联的对象是FailureMessage。

  5. 控制台中也可以查看到打印的日志,包括期望值map对象、实际值map对象、比较的结果。

    image-20210205193917471

ORACLE注意事项

  1. 批量执行SQL,开头和结束需要特殊语法保护。开头添加declare begin,结尾添加end

    declare begin
    delete from ccc where id = '13100000001';
    delete from ccc where id = '13100000002';
    delete from ccc where id = '17100000001';
    end;
    
  2. 执行SQL结尾不能用分号。

  3. 数据库中clob字段查询不出数据,返回的结果为oracle.sql.CLOB@30082f38,需要特殊处理。

### 如何在 JMeter 中对数据库查询结果进行断言 #### 添加 JDBC 请求元件 为了能够执行 SQL 查询,在测试计划中添加一个 `JDBC Request` 元件。通过配置这个组件,可以指定要连接的目标数据库以及想要运行的具体 SQL 语句[^1]。 ```java // 配置示例 (伪代码表示) String sqlQuery = "SELECT * FROM users WHERE id=1"; ``` #### 执行查询并保存结果到变量 当设置好 JDBC 请求后,其返回的数据会被存储在一个或多个由用户定义的变量里。这些变量稍后可用于后续处理或是作为断言的基础[^3]。 #### 使用响应断言验证查询结果 对于简单的值匹配情况,可以直接利用“响应断言”功能来进行校验。选择合适的字段(如期望的结果列),并将实际得到的内容同预设的标准相比较。如果希望检查整个 JSON 结构,则可能需要用到更复杂的断言方式,比如正则表达式或者 XPath 表达式来解析和对比特定部分[^5]。 #### 循环遍历多条记录的情况 如果有多个查询结果需要逐一检验,那么应该考虑采用 ForEach 控制器配合相应的取样器完成迭代过程。这样做的好处是可以动态地调整每次循环所使用的参数,从而简化脚本编写工作量[^4]。 #### 设置 Size 断言确保数据长度一致 除了内容上的准确性外,有时还需要确认接收到的消息体尺寸是否恰当。这时就可以引入 size assertion 来限定允许的最大/最小字节数范围,防止因意外因素造成的信息丢失或冗余问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值