自动化复习巩固第五天封装数据库及断言方法

方法1:处理数据库方法

说明:数据库配置文件,主要存放数据库连接信息

settings.py文件

复制代码
mysql_info = {
    "host": "xxxxx",
    "user": "xxxxx",
    "password": "xxxxx",
    "port": 3306,
    "charset": "utf8mb4",
    "database": "xxxxx",
    "autocommit": True
}

方法2:处理数据库结果方法

作用:处理数据库查询行数以及查询结果

handle_mysql.py文件

复制代码
import pymysql
from loguru import logger
​
class HandleMysql:
​
    #连接数据库,初始化
    def __init__(self,**kwargs):
        self.conn = pymysql.connect(**kwargs,cursorclass=pymysql.cursors.DictCursor)
​
        #创建游标
        self.cur = pymysql.conn.curcor()
​
    #获取影响行数
    def select_and_get_row_counts(self,query_sql):
        logger.info(f"执行的sql语句是{query_sql}")
        counts = self.cur.execute(query_sql)
        logger.info(f"影响的行数是{counts}")
        return counts
​
    #获取影响数据
    def select_and_get_datas(self,query_sql,many=1):
        """
       :param query_sql: 执行sql语句
       :param many: many = 1 代表fetchone,many > 1 代表fetchmany,many < 1 代表fetchall
       :return:
       """
        counts = self.select_and_get_row_counts(query_sql)
        if counts > 0:
            if many == 1:
                data = self.cur.fetchone()
            elif many > 1:
                data = self.cur.fetchmany()
            else:
                data = self.cur.fetchall()
            logger.info(f"影响行数是{many},获取到的数据是{data}")
            return data
​
    #关闭数据库
    def close_db(self):
        self.cur.close()
        self.conn.close()

方法3:excel中前置sql语句执行处理方法

作用:在测试数据中可能会需要在数据库中查询结果来使用,所以在excel中写sql语句执行出来的结果设置为全局变量

handle_pre_sql.py文件

复制代码
from loguru import logger
from settings import mysql_info
from tools.handle_mysql import HandleMysql
from tools.handle_global_data import GlobalData
from tools.handle_replace import replace_mark_by_data
​
​
#执行sql语句,设置全局变量
def execute_presql_and_set_globaldata(pre_sql):
    #首先替换sql语句里面的数据
    new_pre_sql = replace_mark_by_data(pre_sql)
    logger.info(f"替换后的sql语句是{new_pre_sql}")
​
    #连接数据库
    hmysql = HandleMysql(**mysql_info)
​
    #执行sql语句
    dict_data = hmysql.select_and_get_datas(new_pre_sql)
    logger.info(f"查询出来的数据是{dict_data}")
​
    #设置全局变量
    for key,value in dict_data.items():
        setattr(GlobalData,"key","value")
        logger.info(f"设置的全局变量名为{key},值是{value}")
​
    #关闭数据库
    hmysql.close_db()

方法4:exce预期结果断言方法

作用:提前准备好断言字段,然后在执行用例的时候将结果与excel中的预期结果部分进行断言

复制代码
from loguru import logger
from tools.handle_replace import replace_mark_by_data
​
def assert_resp_data(resp_text,expected_str):
    """
   :param resp_text: 响应数据
   :param expected_str: 期望断言数据
   :return:
   """
    logger.info("开始断言响应数据......")
    #替换
    expected_str = replace_mark_by_data(expected_str)
​
    #将数据转换成列表
    assert_data_list = eval(expected_str)
​
    for assert_str in assert_data_list:
        logger.info(f"断言响应结果预期是{assert_str}")
        try:
            assert assert_str in resp_text
            logger.info("断言成功")
        except:
            logger.info(f"断言失败")
            raise
        # 面临的问题:有多个断言条件,某一个断言失败了,那剩下的断言就不会执行了。。
        # pytest有一个第三方库:pytest-assume -- 某个断言失败了不影响下一个断言执行 -- 自行拓展

方法5:数据库断言方法

作用:提取数据库中的结果进行断言

这里的excel中的数据库断言语句格式是:

[ {"sql": 'select * from tz_user where user_mobile="#new_phone#"', "compare_type": "int", "check": 1}, {"sql": 'select level_type from tz_user where user_mobile="#new_phone#"', "compare_type": "dict", "check": {"level_type": 0}} ]

复制代码
from loguru import logger
from settings import mysql_info
from tools.handle_mysql import HandleMysql
from tools.handle_replace import replace_mark_by_data
​
def assert_db(assert_db_str):
    """
   :param assert_db_str: excel中的数据库断言字段
   :return:
   """
    #先替换
    assert_db_str = replace_mark_by_data(assert_db_str)
​
    #再转换成列表
    assert_db_list = eval(assert_db_str)
​
    #连接数据库
    hmysql = HandleMysql(**mysql_info)
​
    for one_assert in assert_db_list:
        if one_assert.get("compare_type") == "int":
            logger.info("执行sql语句,获取执行结果行数")
            result = hmysql.select_and_get_row_counts(one_assert.get("sql"))
        else:
            logger.info("执行sql语句,获取数据")
            result = hmysql.select_and_get_datas(one_assert.get("sql"))
​
        #对比实际与期望是否相等
        logger.info(f"实际结果为{result}")
        logger.info(f'期望结果为{one_assert.get("check")}')
        try:
            assert result == one_assert.get("check")
            logger.info("断言成功")
        except:
            logger.info("断言失败")
            raise
​
    hmysql.close_db()