接口自动化框架篇:MySQL 数据库数据断言封装

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


在接口自动化测试中,数据库断言是一个重要的环节,它能够验证接口操作后的数据库状态是否符合预期。本文将详细介绍如何在 Pytest 框架中封装 MySQL 数据库数据断言,包括参数化、返回数据格式为 JSON 以及日志记录等。

一、封装 MySQL 数据库连接

首先,我们需要封装一个 MySQL 数据库连接工具类,用于执行 SQL 查询和断言。

(一)安装依赖库

pip install pymysql

(二)封装数据库连接类

import pymysql

class MySQLDatabase:

    def __init__(self, host, user, password, db):

        self.host = host

        self.user = user

        self.password = password

        self.db = db

        self.connection = None

    def connect(self):

        self.connection = pymysql.connect(

            host=self.host,

            user=self.user,

            password=self.password,

            db=self.db,

            charset='utf8mb4',

            cursorclass=pymysql.cursors.DictCursor

        )

    def execute_query(self, query):

        ifnotself.connection:

            self.connect()

        with self.connection.cursor() as cursor:

            cursor.execute(query)

            result = cursor.fetchall()

            return result

    def close(self):

        ifself.connection:

            self.connection.close()‍

二、封装数据库断言函数

接下来,封装一个数据库断言函数,用于验证数据库查询结果是否符合预期。

def assert_db_query(query, expected_result):

    """

    验证数据库查询结果是否符合预期。

    :param query: SQL 查询语句

    :param expected_result: 预期的查询结果

    """

    db = MySQLDatabase(host='localhost', user='root', password='password', db='testdb')

    db.connect()

    result = db.execute_query(query)

    db.close()

    assert result == expected_result, f"数据库查询结果不匹配。预期:{expected_result},实际:{result}"

三、参数化测试用例

为了提高测试的灵活性和可维护性,可以使用 Pytest 的 parametrize 功能进行参数化测试。

(一)定义测试数据

test_data = [

    ("SELECT * FROM users WHERE id=1", [{"id": 1, "name": "John Doe"}]),

    ("SELECT * FROM users WHERE id=2", [{"id": 2, "name": "Jane Doe"}]),

]

(二)编写参数化测试用例

import pytest

@pytest.mark.parametrize("query, expected_result", test_data)

def test_database(query, expected_result):

    assert_db_query(query, expected_result)

四、返回数据格式为 JSON

在实际接口测试中,接口返回的数据通常是 JSON 格式。为了方便取值和断言,可以将数据库查询结果转换为 JSON 格式。

(一)封装 JSON 格式断言函数

import json

def assert_json(response, expected_json):

    """

    验证接口返回的 JSON 数据是否符合预期。

    :param response: 接口返回的响应对象

    :param expected_json: 预期的 JSON 数据

    """

    actual_json = response.json()

    assert actual_json == expected_json, f"JSON 数据不匹配。预期:{expected_json},实际:{actual_json}"

(二)结合数据库查询结果

def test_api_and_db():

    # 发起接口请求

    response = requests.get("https://api.example.com/users/1")

    assert_json(response, {"id": 1, "name": "John Doe"})

    # 验证数据库查询结果

    query = "SELECT * FROM users WHERE id=1"

    expected_result = [{"id": 1, "name": "John Doe"}]

    assert_db_query(query, expected_result)‍

五、日志记录封装

为了更好地追踪测试过程,可以在测试用例中添加日志记录。可以使用 logging 模块或第三方库 Loguru。

(一)安装 Loguru

pip install loguru

(二)封装日志记录器

from loguru import logger

logger.add("logs/{time}.log", rotation="1 day", compression="zip")

(三)在测试用例中使用日志记录

def test_api_and_db():

    logger.info("开始测试接口和数据库")

    response = requests.get("https://api.example.com/users/1")

    logger.info("接口请求完成")

    assert_json(response, {"id": 1, "name": "John Doe"})

    query = "SELECT * FROM users WHERE id=1"

    expected_result = [{"id": 1, "name": "John Doe"}]

    assert_db_query(query, expected_result)

    logger.info("数据库验证完成")‍

六、总结

通过封装 MySQL 数据库连接、断言函数、参数化测试用例、JSON 格式验证以及日志记录,可以显著提高接口自动化测试的效率和可维护性。希望本文能够对读者在接口自动化框架中实现 MySQL 数据库数据断言封装提供帮助。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​

接口自动化测试中,数据库验证(或称为数据库断言)是确保接口操作后数据状态符合预期的重要手段。由于接口通常会与数据库进行交互,因此通过对接口调用后的数据库状态进行校验,可以有效提升测试的准确性和可靠性。 ### 数据库验证的实现方式 1. **前置准备** 在执行接口请求之前,可以先对数据库的状态进行快照记录,例如记录某些关键字段的值、表中的记录总数等信息。这一步可以通过SQL查询语句完成。 2. **接口调用** 使用自动化测试工具(如 Postman、Robot Framework 或自定义代码框架)发起接口请求,模拟业务场景下的操作。 3. **后置验证** 接口调用完成后,再次查询数据库中相关表的数据,对比接口调用前后的数据变化。例如: - 验证新增数据是否成功插入 - 修改数据是否正确更新 - 删除操作是否生效 - 事务一致性是否保持 4. **结合断言机制** 将数据库查询结果作为断言的一部分,用于判断测试是否通过。例如,在 Python 中使用 `pytest` 和 `pymysql` 可以这样实现: ```python import pymysql import pytest def test_database_after_api_call(): # 假设已调用某个接口并触发数据库变更 conn = pymysql.connect(host='localhost', user='root', password='password', db='testdb') cursor = conn.cursor() # 查询目标数据 cursor.execute("SELECT COUNT(*) FROM users WHERE status = 'active'") count = cursor.fetchone()[0] # 添加断言验证数据库状态 assert count == 5, "预期 active 用户数量为 5,实际为 {}".format(count) ``` ### 数据库断言的常见挑战及解决方案 - **数据隔离问题** 多个测试用例并发执行时,可能会相互影响数据库状态。解决办法包括: - 使用唯一标识符或临时数据表 - 每次测试前清理并初始化数据 - 使用事务回滚机制(适用于支持事务的数据库)[^1] - **数据准备复杂性** 有些接口依赖多张表的数据联动。可以通过封装数据构造工具类或使用数据库Fixture来简化数据准备过程,例如使用 `factory_boy` 或 `Faker` 库生成测试数据。 - **断言粒度控制** 断言应尽量精确到具体字段和记录,避免粗粒度的验证导致误判。例如,不要只验证记录总数,而应检查具体字段值是否符合预期[^2]。 - **性能瓶颈** 如果每次测试都频繁访问数据库,可能会影响执行效率。可以通过优化 SQL 查询语句、使用缓存机制或异步执行部分验证步骤来缓解这一问题。 ### 测试框架整合建议 - **Postman + Newman**:可以在 Tests 脚本中编写 SQL 查询逻辑,借助外部数据库连接工具(如 Node.js 的 mysql 模块)进行验证。 - **Robot Framework + DatabaseLibrary**:提供了专门用于数据库操作的关键字,方便集成进测试流程中。 - **自定义脚本(Java/Python)**:灵活性最高,可完全控制测试流程和断言逻辑,适合复杂系统[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值