1、日志的封装
思路:
1、输入参数是什么?--logging模块中最基础的对象,用logging.getLogger(name)方法进行初始化,name可以不填。通常logger的名字我们对应模块名,如聊天模块、数据库模块、验证模块等
2、需要返回的是什么?
-- 返回一个log记录对象,
这个对象已经创建了Logger对象,日志等级,输出渠道,样式,输出渠道等,注意日志等级、
调用的时候
do_log.error(f"{one_testcase.name}:具体异常为{e}")
封装代码:
import logging from handle_yaml import do_yaml class HandleLog: def __init__(self, name=None): # 1、创建Logger对象 # 相当于日志记录工具 if name is None: self.my_logger = logging.getLogger("testcase") else: self.my_logger = logging.getLogger(name) # 2、设置日志器的日志等级 # self.my_logger.setLevel("DEBUG") self.my_logger.setLevel(do_yaml.get_data("log", "logger_level")) # 3、创建日志输出渠道(日志显示的地方) console_handler = logging.StreamHandler() console_handler.setLevel("WARNING") # file_handler = logging.FileHandler("testcase.log", encoding="utf-8") file_handler = logging.FileHandler(do_yaml.get_data("log", "log_filename"), encoding="utf-8") # 4、创建日志的显示样式(格式)并与渠道进行关联 formater = logging.Formatter('%(asctime)s - [%(levelname)s] - [msg]: %(message)s - %(name)s - %(lineno)d') console_handler.setFormatter(formater) file_handler.setFormatter(formater) # 5、日志器对象与日志输出渠道(展示的地方)进行关联 self.my_logger.addHandler(console_handler) self.my_logger.addHandler(file_handler) def get_logger(self): return self.my_logger do_log = HandleLog().get_logger() if __name__ == '__main__': do_log = HandleLog() my_logger = do_log.get_logger() my_logger.debug("这是一条debug级别的日志!") my_logger.info("这是一条info级别的日志!") my_logger.warning("这是一条warning级别的日志!") my_logger.error("这是一条error级别的日志!") my_logger.critical("这是一条critical级别的日志!")
2、分层设计-数据驱动思想、分层设计理念
分层设计-目录分级:
数据层(data):用例数据(excel)
配置层(confs):存储配置信息(.conf、.yaml)
用例层(cases):用于存储测试类模块
第三方库层(libs):来存储第三方模块,ddt
日志层(logs):存放日志文件
脚本层(scripts):存放各种模块的封装类
报告层(reports):存放测试报告
入口:接口自动化框架的入口模块
分层设计,特别关注os模块,获取路径
import os # os.path.abspath(__file__) - 当前文件所在的绝对路径 # os.path.dirname(os.path.abspath(__file__)) -- 当前文件所在的目录 # os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -- 文件夹所在的目录 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 获取cases的目录 CASES_PATH = os.path.join(BASE_DIR, "cases")
引用这个封装的path
import os # 刚封装的path from scripts.handle_path import CASES_PATH # 之后,从配置文件中读取excel配置的选项值,和之前配置的路径进行拼接 excel_path = os.path.join(CASES_PATH, do_yaml.get_data("excel", "filename")) do_excel = HandleExcel(excel_path, "register")
3、pymysql操作
pymysql操作步骤:
1、创建连接对象
2、创建游标
3、执行sql
4、提交sql
5、关闭游标
6、关闭连接
建议sql不要用f“{变量}”进行拼接,因为容易发生安全事故,比如说sql注入 1 or 1=1
建议使用:sql3 = 'SELECT * FROM member WHERE mobile_phone = %s;'
import pymysql # 1、创建连接对象 conn = pymysql.connect(host="api.lemonban.com", user="future", password="123456", port=3306, database="futureloan", charset="utf8", # 不能为utf-8 # a.指定每一条记录为字典类型 # b.默认每一条记录为元祖类型 cursorclass=pymysql.cursors.DictCursor ) # 2、创建游标对象 one_cursor = conn.cursor() # 3、执行sql语句 # a.sql语句固定死了 # sql1 = 'SELECT * FROM member WHERE mobile_phone = "13734076707";' # sql2 = 'SELECT * FROM member ORDER BY id DESC LIMIT 0,5;' one_mobile = input("请输入您的手机号!") # sql3 = f'SELECT * FROM member WHERE mobile_phone = {one_mobile};' # b.给sql语句添加参数,%s为占位符 sql3 = 'SELECT * FROM member WHERE mobile_phone = %s;' # one_cursor.execute(sql1) # one_cursor.execute(sql2) # one_cursor.execute(sql3) # c.执行sql语句时,给sql语句传递参数,args为序列类型,参数与sql语句中的%s,一一对应 one_cursor.execute(sql3, args=[one_mobile]) # 4、获取值并提交 # fetchone获取一条数据,如果游标类为DictCursor,则结果为字典类型 # fetchall获取多条数据,如果游标类为DictCursor,则结果为嵌套字典的列表类型 result = one_cursor.fetchone() # result = one_cursor.fetchall() # 提交结果 conn.commit() # 5、关闭连接 # a.必须先关游标 # b.再关连接 one_cursor.close() conn.close()