day22-20200509_日志封装_分层设计_pymysql

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()
原文地址:https://www.cnblogs.com/shishibuwan/p/12872936.html