• 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()
  • 相关阅读:
    C# ToString格式大全
    如何将数据库中的表导入到PowerDesigner中
    IIS配置wap服务器
    URL加随机数的作用
    程序员人生路
    Asp.net三种事务处理
    20121107荣迪信息技术有限公司面试总结
    ubuntu 安装之后的问题
    windows系统+VS2013编译GDAL(使用cmd命令行)
    VS2013+OPENCV+GDAL处理多光谱数据
  • 原文地址:https://www.cnblogs.com/shishibuwan/p/12872936.html
Copyright © 2020-2023  润新知