接口自动化框架篇:MySQL 数据库封装(增删改查)

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

📝 职场经验干货:

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

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

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

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

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

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

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


在接口自动化测试中,与数据库的交互是验证接口操作是否成功的关键步骤之一。封装 MySQL 数据库操作不仅可以提高代码的复用性,还能使测试用例更加简洁和易于维护。本文将详细介绍如何在 Pytest 框架中封装 MySQL 数据库操作,包括连接数据库、执行增删改查操作、参数化测试以及日志记录等。

一、封装 MySQL 数据库连接

(一)安装依赖库

首先,需要安装 pymysql 库,这是一个用于 Python 连接 MySQL 数据库的库。

pip install pymysql

(二)封装数据库连接类

创建一个 database.py 文件,封装数据库连接和增删改查操作。

import pymysql

import json

from loguru import logger

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):

        """建立数据库连接"""

        try:

            self.connection = pymysql.connect(

                host=self.host,

                user=self.user,

                password=self.password,

                db=self.db,

                charset='utf8mb4',

                cursorclass=pymysql.cursors.DictCursor

            )

            logger.info("数据库连接成功")

        except Exception as e:

            logger.error(f"数据库连接失败:{e}")

            raise

    def execute_query(self, query, params=None):

        """执行 SQL 查询"""

        ifnot self.connection:

            self.connect()

        try:

            with self.connection.cursor() as cursor:

                cursor.execute(query, params)

                result = cursor.fetchall()

                return json.dumps(result, ensure_ascii=False)  # 返回 JSON 格式的数据

        except Exception as e:

            logger.error(f"执行查询失败:{e}")

            raise

    def execute_update(self, query, params=None):

        """执行 SQL 更新操作(增删改)"""

        ifnot self.connection:

            self.connect()

        try:

            with self.connection.cursor() as cursor:

                cursor.execute(query, params)

                self.connection.commit()

                return cursor.rowcount  # 返回受影响的行数

        except Exception as e:

            self.connection.rollback()

            logger.error(f"执行更新失败:{e}")

            raise

    def close(self):

        """关闭数据库连接"""

        if self.connection:

            self.connection.close()

            logger.info("数据库连接已关闭")‍

二、封装增删改查操作

(一)封装增删改查方法

在 MySQLDatabase 类中,封装增删改查方法,方便在测试用例中调用。

class MySQLDatabase:

    # ... 其他方法 ...

    def insert(self, table, data):

        """插入数据"""

        columns = ', '.join(data.keys())

        values = ', '.join(['%s'] * len(data))

        query = f"INSERT INTO {table} ({columns}) VALUES ({values})"

        return self.execute_update(query, tuple(data.values()))

    def delete(self, table, condition):

        """删除数据"""

        query = f"DELETE FROM {table} WHERE {condition}"

        return self.execute_update(query)

    def update(self, table, data, condition):

        """更新数据"""

        set_clause = ', '.join([f"{key}=%s"for key in data.keys()])

        query = f"UPDATE {table} SET {set_clause} WHERE {condition}"

        return self.execute_update(query, tuple(data.values()))

    def select(self, table, condition=None):

        """查询数据"""

        if condition:

            query = f"SELECT * FROM {table} WHERE {condition}"

        else:

            query = f"SELECT * FROM {table}"

        return self.execute_query(query)

(二)示例:使用封装的增删改查方法

def test_database_operations():

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

    db.connect()

    # 插入数据

    data = {"name": "John Doe", "email": "john.doe@example.com"}

    inserted_rows = db.insert("users", data)

    logger.info(f"插入行数:{inserted_rows}")

    # 查询数据

    query = "SELECT * FROM users WHERE name=%s"

    result = db.execute_query(query, ("John Doe",))

    logger.info(f"查询结果:{result}")

    # 更新数据

    update_data = {"email": "john_updated@example.com"}

    updated_rows = db.update("users", update_data, "name='John Doe'")

    logger.info(f"更新行数:{updated_rows}")

    # 删除数据

    deleted_rows = db.delete("users", "name='John Doe'")

    logger.info(f"删除行数:{deleted_rows}")

    db.close()‍

三、参数化测试用例

使用 Pytest 的 parametrize 功能,可以实现参数化测试,从而提高测试的覆盖率和灵活性。

(一)定义测试数据

在测试文件中定义测试数据,可以使用列表或从外部文件加载。

test_data = [

    ("users", {"name": "John Doe", "email": "john.doe@example.com"}, "name='John Doe'", {"email": "john_updated@example.com"}),

    ("users", {"name": "Jane Doe", "email": "jane.doe@example.com"}, "name='Jane Doe'", {"email": "jane_updated@example.com"}),

]

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

import pytest

from database import MySQLDatabase

@pytest.mark.parametrize("table, insert_data, condition, update_data", test_data)

def test_database_operations(table, insert_data, condition, update_data):

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

    db.connect()

    # 插入数据

    inserted_rows = db.insert(table, insert_data)

    assert inserted_rows == 1, "插入数据失败"

    # 查询数据

    query = f"SELECT * FROM {table} WHERE {condition}"

    result = db.execute_query(query)

    assert json.loads(result), "查询数据失败"

    # 更新数据

    updated_rows = db.update(table, update_data, condition)

    assert updated_rows == 1, "更新数据失败"

    # 删除数据

    deleted_rows = db.delete(table, condition)

    assert deleted_rows == 1, "删除数据失败"

    db.close()‍

四、返回数据格式为 JSON

在封装的数据库类中,execute_query 方法返回的数据已经是 JSON 格式,这使得在测试用例中可以直接使用返回的数据,而无需额外的处理。

(一)示例:验证接口返回数据与数据库查询结果一致

假设有一个接口返回用户信息,我们希望验证接口返回的数据与数据库中的数据一致。

import requests

def test_api_and_db():

    # 发起接口请求

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

    api_result = response.json()

    # 查询数据库

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

    db.connect()

    query = "SELECT * FROM users WHERE id=%s"

    db_result = json.loads(db.execute_query(query, (1,)))

    db.close()

    # 验证接口返回数据与数据库查询结果一致

    assert api_result == db_result[0], f"接口返回数据与数据库查询结果不匹配。接口返回:{api_result},数据库查询:{db_result[0]}"

五、日志记录封装

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

(一)安装 Loguru

pip install loguru

(二)封装日志记录器

from loguru import logger

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

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

from loguru import logger

def test_api_and_db():

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

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

    api_result = response.json()

    logger.info(f"接口返回数据:{api_result}")

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

    db.connect()

    query = "SELECT * FROM users WHERE id=%s"

    db_result = json.loads(db.execute_query(query, (1,)))

    db.close()

    logger.info(f"数据库查询结果:{db_result[0]}")

    assert api_result == db_result[0], f"接口返回数据与数据库查询结果不匹配。接口返回:{api_result},数据库查询:{db_result[0]}"

    logger.info("测试完成")‍

六、总结

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

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

​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值