函数编程10--函数模型-生成日志

project_h1目录在test.py文件,编写log()函数

目的:使用log()方法生成日志

import logging,time
def log():
    # 创建日志对象
    logger = logging.getLogger()
    # 禁止日志重复输出 ,每个日志输出一次
    if not logger.handlers:
        # 指定日志输出级别
        logger.setLevel(logging.INFO)  # 高于INFO的信息都输出到日志
        # 指定日志中的输出格式
        # asctime 当前日志时间
        # 当前日期时间 - 类型 - 文件名[行号] - 消息
        formatter = logging.Formatter('%(asctime)s-%(levelname)s - %(filename)s[%(lineno)d]-%(message)s')
        # 创建日志文件
        log_file_name = time.strftime('%Y%m%d') + '.log'
        # 打开日志文件
        logfile = open(log_file_name, 'wb')  # w:写 ,b:字节
        # 创建处理器
        console = logging.StreamHandler()  # 流处理器  输出控制台
        filehand = logging.FileHandler(log_file_name, encoding='utf-8')  # 文件处理器 输出文件
        # 指定处理器的日志输出格式
        console.setFormatter(formatter)
        filehand.setFormatter(formatter)
        # 增加处理器到日志对象
        logger.addHandler(console)
        logger.addHandler(filehand)
        # 关闭处理器
        console.close()
        filehand.close()
    return logger
# 调用日志
# log().info('成功的消息')
# log().info('成功22')
# log().error('错误的消息')
# log().error('错误222')

日志输出到控制台和文件步骤


    导入模块logging
    创建日志对象
    设置日志输出等级
    设置日志输出格式
    指定日志文件名(常用日期时间字符串)
    创建日志处理器(流处理器<控制台>、文件处理器)
    设置日志处理器的日志输出格式(控制台、文件)
    日志处理器增加到日志对象(控制台、文件)
    关闭日志处理器(控制台、文件)
    返回日志对象

日期时间转字符串

    import time
    time.strftime('%Y%m%d %H%M%S')

日期时间转字符串

import time#导入时间模块,不需要安装
now = time.strftime('%Y%m%d %H%M%S')#将日期和时间转为字符格式
print(now)

创建日志文件处理器

    filelog=logging.FileHandler(logfile, encoding='utf-8')
        logfile日志文件名,日志默认是追加方式,若要覆盖可用mode='w'
        encoding='utf-8',向日志中写汉字时,需要指定编码方式

将日志输出到显示器(控制台)和文件步骤总结

# 创建日志对象
    logger = logging.getLogger()
# 设置日志输出级别
    logger.setLevel(logging.INFO) # 由低到高的级别:DEBUG - INFO - WARNING-ERROR-CRITICAL ,设置为info表示比info高的级别都显示
# 设置日志输出格式
    formatter = logging.Formatter('%(asctime)s-%(filename)s[%(lineno)d] - %(message)s')
# 禁止日志输出多次
    if not logger.handlers:
# 创建日志处理器
        console = logging.StreamHandler()
        filehand = logging.FileHandler(log_file_name,encoding='utf-8')
        #日志文件不需要事先打开,encoding用于向日志输出汉字时
# 设置日志处理的格式
        console.setFormat(formatter)
        filehand.setFormat(formatter)
# 增加日志处理器到日志对象
        logger.addHandler(console)
        logger.addHandler(filehand)
# 关闭处理器
        console.close()
        filehand.close()
# 返回日志对象
    return logger
# 调用日志函数
    log().info('自定义日志消息')
    info 可以换成error、warning、critical这些都是关键字

调试project_h1目录 test.py

project_h1目录 test.py
    目的: 在每个函数中加入日志记录
            正确处理时、测试通过时,输出info信息
            测试失败时,输出warning信息
            出现异常时,输出error信息
import logging, time


def log():
    # 创建日志对象
    logger = logging.getLogger()
    # 禁止日志重复输出 ,每个日志输出一次
    if not logger.handlers:
        # 指定日志输出级别
        logger.setLevel(logging.INFO)  # 高于INFO的信息都输出到日志
        # 指定日志中的输出格式
        # asctime 当前日志时间
        # 当前日期时间 - 类型 - 文件名[行号] - 消息
        formatter = logging.Formatter('%(asctime)s-%(levelname)s - %(filename)s[%(lineno)d]-%(message)s')
        # 创建日志文件
        log_file_name = time.strftime('%Y%m%d') + '.log'
        # 打开日志文件
        logfile = open(log_file_name, 'wb')  # w:写 ,b:字节
        # 创建处理器
        console = logging.StreamHandler()  # 流处理器  输出控制台
        filehand = logging.FileHandler(log_file_name, encoding='utf-8')  # 文件处理器 输出文件
        # 指定处理器的日志输出格式
        console.setFormatter(formatter)
        filehand.setFormatter(formatter)
        # 增加处理器到日志对象
        logger.addHandler(console)
        logger.addHandler(filehand)
        # 关闭处理器
        console.close()
        filehand.close()
    return logger


# 调用日志
# log().info('成功的消息')
# log().info('成功22')
# log().error('错误的消息')
# log().error('错误222')
import configparser, os


def entry():
    """
    读入口函数:entry()
    :return: 返回值是一个元组(被测接口服务器名,数据库服务器名)
    """
    try:
        conf = configparser.ConfigParser()  # 创建对象
        conf.read('entry.ini', encoding='utf-8')  # 读取文件
        which_server = conf.get('entry', 'which_server')  # 读取被测服务器名
        which_db = conf.get('entry', 'which_db')  # 读取数据库服务器名
        log().info('本次测试的接口服务器是' + which_server + ',数据库服务器是' + which_db)
        return which_server,which_db
    except Exception as e:
        log().error('读取入口配置文件entry.ini失败' + e)


# 调试
# entry()


def server_info():  #
    """
    读接口服务器信息:包括IP,端口号,组装成http://ip:端口的形式
    :return:返回接口地址
    """
    try:
        which_server = entry()[0]
        # 读server.conf中的which_server节点,获得IP、Port
        conf = configparser.ConfigParser()
        # conf对象中read方法,读取server.conf文件,字符编码设置为utf-8
        conf.read('server.conf', encoding='utf-8')
        # 根据exam节点获取键名IP所对应的值,赋值给ip变量
        ip = conf.get(which_server, 'IP')
        port = conf.get(which_server, 'port')
        host = 'http://' + ip + ':' + port
        log().info('接口服务器的地址==' + host)
        return host
    except Exception as e:  # Exception是一个关键字,表示所有的异常,e是别名
        log().error('接口服务器地址[server.conf]获取失败' + e)


# 调试
# server_info()


def db_info():  # 读db.conf,获得数据库服务器的信息
    try:  # 异常处理
        which_db = entry()[1]# 获得被测数据库服务器名
        conf = configparser.ConfigParser()
        conf.read('db.conf', encoding='utf-8')
        host = conf.get(which_db, 'host')
        port = conf.get(which_db, 'port')
        user = conf.get(which_db, 'user')
        password = conf.get(which_db, 'password')
        db = conf.get(which_db, 'db')
        dbinfo = {'host': host, 'port': int(port), "user": user, 'password': password, 'db': db}
        log().info('数据库信息==' + str(dbinfo))
        return dbinfo
    except Exception as e:
        log().error('数据库配置文件[db.conf]读取出错' + e)


# 调试
# db_info()


#
#
def read_sqls(sqlfiles=[]):  # 读指定sql命令文件的函数,读取到的sql命令存入列表返回;如果没有给实参,则读所有txt中的sql命令
    try:
        if len(sqlfiles) == 0:  # 表示没有给实参,则读取所有sql文件
            sqlfiles = [file for file in os.listdir('.') if file.endswith('.sql')]  # 所有.sql文件名存入sqlfiles列表
        sqls = []  # 存sql语句的列表
        for file in sqlfiles:
            sqlfile = open(file, 'r', encoding='utf-8')  # 打开一个文件
            for row in sqlfile:  # row表示文件中每一行
                # 如果这行字符长度大于0 并且 不是以--开头的
                if len(row.strip()) > 0 and not row.startswith('--'):
                    sqls.append(row.strip())  # sql语句中的回车不存入列表
        log().info('读取初始化sql语句成功==' + str(sqlfiles))
        return sqls
    except Exception as e:
        log().error('读取初始化sql语句出错' + e)


# 调试
# read_sqls()
import pymysql


def conn_db():  # 连接数据库的函数
    try:
        dbinfo = db_info()  # 数据库信息,存入dbinfo字典
        conn = pymysql.connect(**dbinfo)  # 连接数据库
        log().info('连接数据库成功')
        return conn
    except Exception as e:
        log().error('数据库连接出错' + e)

# 调试
# conn_db()

def init_db(sqlfiles=[]):  # 执行指定sql文件中的命令
    """
    目的:数据初始化
    :param sqlfiles: 指定sql文件
    :return:
    """
    try:
        sqls = read_sqls(sqlfiles)  # 读取所有需要执行的sql命令
        conn = conn_db()  # 连接数据库
        cursor = conn.cursor()  # 创建游标
        for sql in sqls:
            cursor.execute(sql)  # 执行sql语句
        conn.commit()  # 提交数据到数据库
        conn.close()
        log().info('初始化数据库成功')
    except Exception as e:
        log().error('初始化数据库出错')


# 调试
# init_db()

import pandas


def read_cases(excel, columns=[]):  # 读取excel用例中的指定列
    try:
        if len(columns) == 0:
            file = pandas.read_excel(excel)  # 读取所有列
        else:
            file = pandas.read_excel(excel, usecols=columns)  # 读取指定列
        data = file.values.tolist()  # 文件数据转为列表
        log().info('读取用例文件' + excel + '成功')
        return data
    except Exception as e:
        log().error('读取测试用例文件出错')


# 调试
# read_cases('login.xlsx')


def check_db(case_name, expectsql, dbexpect):
    """
    落库检查 检查测试结束后数据的正确性
    :param case_name: 用例名称
    :param expectsql: sql预期语句
    :param dbexpect:  数据库预期结果
    :return:
    """
    conn = conn_db()  # 连接数据库
    try:
        cursor = conn.cursor()  # 创建游标
        cursor.execute(expectsql)  # 执行sql语句
        dbactual = cursor.fetchone()[0]  # 取第一行第一列数据
        if dbactual == dbexpect:
            log().info(case_name + '==落库检查==通过')
        else:
            log().warning(case_name + '==落库检查==失败==预期行数:' + str(dbexpect) + ',实际行数:' + str(dbactual))
    except Exception as e:
        log().error('落库检查出错' + e)


# 调试
# check_db('数据库行数', 'select count(*) from user', 5)
import requests


def test_login():
    """
    测试登录接口
    :return:
    """
    # 数据库初始化
    init_db(['login.sql'])
    # 读测试用例数据
    cases = read_cases('login.xlsx')  # 用例:用例名0、参数数据1、预期结果2
    # 读接口服务器地址
    host = server_info()
    address = host + '/exam/login/'
    try:
        # 发送请求
        for case in cases:  # case代表一行用例
            case_name = case[0]  # 第0列,是用例名称
            argument = eval(case[1])  # 要发送的参数
            expect = case[2]  # 预期接口的返回结果
            res = requests.post(url=address, data=argument)
            actual = res.text
            # 结果比对
            if expect in actual:
                log().info('比对接口返回==' + case_name + '==通过')
            else:
                log().warning('比对接口返回==' + case_name + '==失败==预期结果:' + expect + ',实际结果:' + actual)
    except Exception as e:
        log().error('登录接口测试出错' + e)


# 调试
# test_login()


def test_signup():
    """
    测试注册接口
    :return:
    """
    # 数据库初始化
    init_db(['signup.sql'])
    # 读测试用例
    cases = read_cases('signup.xlsx')
    # 接口地址
    host = server_info()
    address = host + '/exam/signup/'
    try:
        # 发送请求
        for case in cases:
            case_name = case[0]  # 用例名称
            argument = eval(case[1])  # 参数
            expect = eval(case[2])  # 预期接口返回结果
            sql = case[3]  # 预期sql
            dbexpect = case[4]  # 预期数据库行数
            # 发送请求
            res = requests.post(url=address, data=argument)
            actual = res.json()  # 实际结果(字典)
            # 比对接口返回结果
            if expect == actual:
                log().info("比对接口返回==" + case_name + '==通过')
            else:
                log().warning('比对接口返回==' + case_name + '==失败==预期结果:' + str(expect) + ',实际结果:' + str(actual))
            # 落库检查
            conn = conn_db()
            cursor = conn.cursor()
            cursor.execute(sql)
            dbactual = cursor.fetchone()[0]
            if dbexpect == dbactual:
                log().info('落库检查==' + case_name + '==通过')
            else:
                log().warning('落库检查==' + case_name + '==失败==预期行数:' + str(dbexpect) + "实际行数:" + str(dbactual))
            conn.close()
    except Exception as e:
        log().error('注册接口测试出错' + e)


# 调试
test_signup()

posted @ 2021-11-07 12:48  暄总-tester  阅读(100)  评论(0)    收藏  举报