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

发表于:2021-4-13 09:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:宅男统治世界    来源:CSDN

  数据库断言
  数据库驱动配置步骤
  1.添加驱动包。点击测试计划,找到库配置,点击“浏览”配置驱动包。
  2.添加数据库配置元件。右键测试计划或者线程组,点击添加,选择JDBC Connection Configuration。
  Variable Name For created pool:数据库配置的环境变量名字。这里先配置为db。
  Database URL:数据库连接URL。
  JDBC Driver Class:数据库驱动类名。右边可以下拉选择。
  Username:数据库用户名。
  Password:数据库密码。
  Connection Properties:数据库连接属性。这里可以不配置。
  3.点击添加取样器,选择jdbc request。
  4.输入sql,启动测试用例即可查询到数据。
  增加断言
  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();
      }
  }
  脚本说明:
  这里是取数据库请求返回的第一条数据(取不到则校验失败),放到实际值map对象中,与BeanShell中定义的期望值map对象进行比较。可以根据自己的测试场景进行改造。
  期望值可以写成${param}的形式,脚本会判断$开头的期望值,到环境变量中取。
  FailureMessage、log、Result、Failure都是jmeter的预置的变量,不需要重新定义。
  定义Map对象的时候,不能写尖括号(不清楚原理,应该是不支持泛型)。
  使用TreeMap是为了打印期望值与实际值时,参数名字保持顺序,方便肉眼查看。
  数据库请求的返回结果需要赋值到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对象、比较的结果。
  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,需要特殊处理。

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号