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,需要特殊处理。

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值