Skip to content

数据库操作与断言

数据库操作与断言

简介

在接口自动化测试过程中,通常会通过接口的响应值去验证接口是否请求成功以及是否符合需求。

除了通过接口响应值去做验证之外,通常也会通过查询数据库的方式进行辅助验证。

使用场景

在自动化测试过程中,会产生大量的脏数据,应该如何进行处理。

针对于这个问题,通常有两个解决方案:

  • 通过对应的 Delete 接口删除。
  • 自动化测试使用干净的测试环境,每次自动化测试执行完成之前或之后做数据还原。

数据库操作的注意事项

为什么不建议直接通过删除语句直接删除脏数据。

在实际工作中,大部分公司的权限管理做的非常严格,删数据是一个非常敏感的操作,不会直接放给测试进行操作。

即使在有权限的情况下,大部分数据表的关联关系是非常之复杂的,一旦漏掉其中一点细节,都会导致数据没有删干净而产生 Bug。所以不建议测试直接对数据库的数据进行删除操作。

实现方案

如何结合数据库操作辅助断言呢?可以把这个过程分为两个步骤:

  • 连接与配置。
    • 封装数据库配置。
    • 封装 sql 查询操作。
    • 调用方法执行 sql 语句。
  • 查询数据与断言。
    • 查询数据,添加查询条件。
    • 断言结果不为 None。

环境准备

  • 主机: litemall.hogwarts.ceshiren.com
  • 端口: 13306
  • 用户名: test
  • 密码: test123456

注意: 只有查询权限

实现方案(Python)

  • 连接与配置。
import pymysql

# 封装建立连接的对象
def get_conn():
    conn = pymysql.connect(
        host="litemall.hogwarts.ceshiren.com",
        port=13306,
        user="test",
        password="test123456",
        database="litemall",
        charset="utf8mb4"
    )
    return conn
# 执行sql语句
def execute_sql(sql):
    connect = get_conn()
    cursor = connect.cursor()
    cursor.execute(sql)  # 执行SQL
    record = cursor.fetchone()  # 查询记录
    return record
# 查询查询user123这个用户的购物车有一个名称为 hogwarts1 的商品
sql_res = execute_sql("select * from litemall_cart where "
            "user_id=1 and deleted=0 and "
            "goods_name='hogwarts1'")

assert sql_res
  • 查询与断言
# 查询查询user123这个用户的购物车有一个名称为 hogwarts1 的商品
sql_res = execute_sql("select * from litemall_cart where "
            "user_id=1 and deleted=0 and "
            "goods_name='hogwarts1'")

assert sql_res

实现方案(Java)

  • maven依赖
<!--        jdbc 的driver依赖-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
</dependency>
  • 封装连接与查询方法
public class DatabaseUtils {
    Statement statement;
    Connection conn;
    // 初始化数据库信息
    public DatabaseUtils(String DB_URL, String USER, String PASS) {
        try {
            Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
            statement = conn.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    // 根据 sql 返回在数据库查询的信息
    public List<String> getResultStringListBySQL(String sql_query, String columnLabel){
        List<String> resList = new ArrayList<>();
        try {
            ResultSet resultSet = statement.executeQuery(sql_query);
            while (resultSet.next()){
            resList.add(resultSet.getString(columnLabel));
            }
        }catch (SQLException e) {
            e.printStackTrace();
        }
        return resList;
    }
}
  • 断言数据库数据
public class DatabaseTest {
    static final String DB_URL = "jdbc:mysql://litemall.hogwarts.ceshiren.com:13306/litemall?useSSL=false";
    static final String USER = "test";
    static final String PASS = "test123456";
    static final String QUERY = "select * from litemall_cart where user_id=1 and deleted=0";
    @Test
    void getDataBySql()  {
        // 初始化数据库工具类
        DatabaseUtils databaseUtils = new DatabaseUtils(DB_URL, USER, PASS);
        // 提取查询结果中所有的goods_name
        List<String> dataResult = databaseUtils.getResultStringListBySQL(QUERY, "goods_name");
        // 断言数据库数据是否包含hogwarts
        assertTrue(dataResult.contains("hogwarts"));
    }
}

总结

  • 数据库连接
  • 数据库查询