专栏首页测试游记Java自动化测试(数据库断言 18)

Java自动化测试(数据库断言 18)

数据库

数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等操作。 所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

JDBC 驱动程序

JDBC(java database connectivity)驱动程序是对 JDBC 规范完整的实现,它的存在在 Java 程序与数据库系统之间建立了一条通信的渠道。

DBUtils封装了JDBC的操作,核心功能如下:
    1、QueryRunner中提供对sql语句操作的API.
    2、ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
    3、DbUtils类是一个工具类,定义了关闭资源与事务处理的方法
QueryRunner核心类:
    update(Connection conn, String sql, Object... params) ,执行insert update delete操作
    query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,执行 select操作

Maven中配置DBUtils

<!-- mysql数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
</dependency>
<!-- 数据库连接工具包 -->
<dependency>
    <groupId>commons-dbutils</groupId>
    <artifactId>commons-dbutils</artifactId>
    <version>1.6</version>
</dependency>

数据库连接工具类

package com.zhongxin.utils;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCUtils {

    public static Connection getConnection() {
        //定义数据库连接
        String url = "jdbc:mysql://api.lemonban.com:3306/futureloan?useUnicode=true&characterEncoding=utf-8";
        String user = "future";
        String password = "123456";
        //定义数据库连接对象
        Connection conn = null;
        try {
            //你导入的数据库驱动包, mysql。
            conn = DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static void close(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

更新数据

public static void update() throws SQLException {
    QueryRunner runner = new QueryRunner();
    String sql = "UPDATE member SET leave_amount=100 WHERE id=2073699;";
    Connection conn = JDBCUtils.getConnection();
    int count = runner.update(conn, sql);
    System.out.println(count);
    JDBCUtils.close(conn);
}

插入数据

public static void insert() throws SQLException {
    QueryRunner runner = new QueryRunner();
    String sql = "INSERT INTO member VALUES(NULL,'zhong','123456','15168230600,1,100,NOW());";
    Connection conn = JDBCUtils.getConnection();
    int count = runner.update(conn, sql);
    System.out.println(count);
    JDBCUtils.close(conn);
}

从上可以看出,更新和插入的区别就在SQL语句不同

查询数据

通过MapHandler查询

public static void main(String[] args) throws Exception {
    QueryRunner runner = new QueryRunner();
    String sql = "select * from member where id=2073699";
    Connection conn = JDBCUtils.getConnection();
    MapHandler handler = new MapHandler();
    Map<String, Object> map = runner.query(conn, sql, handler);
    System.out.println(map);
    JDBCUtils.close(conn);
}

数据查询

定义一个数据对象

package com.zhongxin.pojo;

import java.math.BigDecimal;
import java.sql.Timestamp;

public class Member {
    private int id;
    private String reg_name;
    private String pwd;
    private String mobile_phone;
    private int type;
    private BigDecimal leave_amount;
    private Timestamp reg_time;

    @Override
    public String toString() {
        return "Member{" +
                "id=" + id +
                ", reg_name='" + reg_name + '\'' +
                ", pwd='" + pwd + '\'' +
                ", mobile_phone='" + mobile_phone + '\'' +
                ", type=" + type +
                ", leave_amount=" + leave_amount +
                ", reg_time=" + reg_time +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getReg_name() {
        return reg_name;
    }

    public void setReg_name(String reg_name) {
        this.reg_name = reg_name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getMobile_phone() {
        return mobile_phone;
    }

    public void setMobile_phone(String mobile_phone) {
        this.mobile_phone = mobile_phone;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public BigDecimal getLeave_amount() {
        return leave_amount;
    }

    public void setLeave_amount(BigDecimal leave_amount) {
        this.leave_amount = leave_amount;
    }

    public Timestamp getReg_time() {
        return reg_time;
    }

    public void setReg_time(Timestamp reg_time) {
        this.reg_time = reg_time;
    }
}

通过BeanHandler获取

public static void beanHandler() throws SQLException {
        QueryRunner runner = new QueryRunner();
        String sql = "select * from member where id=2073699";
        Connection conn = JDBCUtils.getConnection();
        BeanHandler<Member> handler = new BeanHandler<>(Member.class);
        Member m = runner.query(conn, sql, handler);
        System.out.println(m);
        JDBCUtils.close(conn);
    }

查询结果

通过BeanListHandler查询

public static void main(String[] args) throws Exception {
    QueryRunner runner = new QueryRunner();
    String sql = "select * from member";
    Connection conn = JDBCUtils.getConnection();
    BeanListHandler<Member> handler = new BeanListHandler<>(Member.class);
    List<Member> list = runner.query(conn, sql, handler);
    for (Member member : list) {
        System.out.println(member);
    }
    JDBCUtils.close(conn);
}

通过ScalarHandler查询

public static void scalarHandler() throws SQLException {
    QueryRunner runner = new QueryRunner();
    String sql = "select count(*) from member where id=2073699";
    Connection conn = JDBCUtils.getConnection();
    ScalarHandler<Long> handler = new ScalarHandler<>();
    Long count = runner.query(conn, sql, handler);
    System.out.println(count);
    JDBCUtils.close(conn);
}

数据库断言

从excel中读取sql语句

public static Object getSingleResult(String sql) {
    if (StringUtils.isBlank(sql)) {
        return null;
    }
    // 1. 定义返回值
    Object result = null;
    try {
        // 2. 创建DBUtils sql语句操作类
        Connection conn = JDBCUtils.getConnection();
        // 3. 获取数据库连接
        QueryRunner runner = new QueryRunner();
        // 4. 创建ScalarHandler,针对单行单列的数据
        ScalarHandler handler = new ScalarHandler();
        // 5. 执行sql语句
        result = runner.query(conn, sql, handler);
        // 6. 关闭数据库连接
        JDBCUtils.close(conn);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return result;
}

对注册进行数据库断言

@Test(dataProvider = "datas")
public void test(CaseInfo caseInfo) {
    Long beforeSQLresult = (Long) SQLUtils.getSingleResult(caseInfo.getSql());
    String responseBody = HttpUtils.call(caseInfo, UserData.DEFAULT_HEADERS);
    responseAssert(caseInfo.getExpectedResult(), responseBody);
    addWriteBackData(sheetIndex, caseInfo.getId(), 8, responseBody);
    Long afterSQLresult = (Long) SQLUtils.getSingleResult(caseInfo.getSql());
    if (StringUtils.isNoneBlank(caseInfo.getSql())) {
        if (beforeSQLresult == 0 && afterSQLresult == 1) {
            System.out.println("数据库断言成功");
        } else {
            System.out.println("数据库断言失败");
        }
    }
}

对充值进行数据库断言

@Test(dataProvider = "datas")
public void test(CaseInfo caseInfo) {
    BigDecimal beforeSQLresult = (BigDecimal) SQLUtils.getSingleResult(caseInfo.getSql());
    HashMap<String, String> headers = getAuthorizationHeader();
    String responseBody = HttpUtils.call(caseInfo, headers);
    responseAssert(caseInfo.getExpectedResult(), responseBody);
    addWriteBackData(sheetIndex, caseInfo.getId(), 8, responseBody);
    BigDecimal afterSQLresult = (BigDecimal) SQLUtils.getSingleResult(caseInfo.getSql());
    if (StringUtils.isNotBlank(caseInfo.getSql())) {
        String amountStr = JSONPath.read(caseInfo.getParams(), "$.amount").toString();
        BigDecimal amout = new BigDecimal(amountStr);
        BigDecimal subtractResult = afterSQLresult.subtract(beforeSQLresult);
        // compareTo == 0 => 相等
        if (subtractResult.compareTo(amout) == 0) {
            System.out.println("数据库断言成功");
        } else {
            System.out.println("数据库断言失败");
        }
    }
}

本文分享自微信公众号 - 测试游记(zx94_11),作者:zx钟

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java自动化测试(登陆接口测试 14)

    zx钟
  • Java自动化测试(回写与断言 17)

    com.zhongxin.utils.ExcelUtils中需要增加一个wdbList,用于存储运行测试时候每次产生的结果

    zx钟
  • Java自动化测试(字符串与集合的常用API 6)

    zx钟
  • JDK1.9-JDBC

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    cwl_java
  • JavaWeb 例子 JDBC+JSP登陆注册留言板

    注册页面: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEn...

    二十三年蝉
  • Eclipse中java向数据库中添加数据,更新数据,删除数据

    前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据。 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的...

    别先生
  • JDBC这个问题,问的小伙伴一脸懵逼

    他顿时一脸懵逼,因为大部分人只知道JDBC的几个步骤,至于底层到底是怎么连接数据库的,还真不知道。

    田维常
  • 清华大学研究团队提出基于忆阻器阵列的新型脑机接口

    脑机接口技术作为信息科学与神经科学等多学科交叉融合的前沿领域,在康复医学、医疗电子等领域得到了广泛关注与应用。来自清华大学的科研团队提出基于忆阻器阵列的新型脑机...

    脑机接口社区
  • Spring Boot系列-- 如何自定义Starter!

    spring-boot-autoconfigure此jar包中包含大量核心注解,包含条件注解等。创建properties属性类,用于读取属性。

    田维常
  • 前端如何配合后端完成RBAC权限控制

    承蒙 D2Projects开源组 的邀请,就写了这篇文章,平时写的不多,失误之处,请大家多多包涵。

    FairyEver

扫码关注云+社区

领取腾讯云代金券