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

 

方法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()
 

 

 

 

posted @ 2024-01-19 20:08  xuhao2008  阅读(55)  评论(0)    收藏  举报