loggerController.py:封装日志记录器(Python+pytest)

前言

志(Log)记录是一种看起来对一般用户没什么作用,但对程序开发者用处很大的东西,它能查出错误或异常的蛛丝马迹。对咱老百姓有何意义吗?答案是当然的。很多软件都有错误报告功能,其实这是帮助作者改善软件的最佳渠道,很多时候我们把它忽略了。当软件运行出错的时候,我们其实并不该抱怨,而是应积极主动帮助作者解决这个问题,而最佳的帮助方式,就是发送错误报告。在错误报告中,最重要的就包括运行日志记录信息了。不过平时我们是见不着这些日志的,而且本软件就能把这些日志陈列出来,然后发送给作者。善用报告,为软件升级贡献你的力量,这只是举手之劳。让这款默默无闻的日志记录器,让您参与到软件开发的团队中去吧!

一,封装日志记录器

实际项目中,我们不可能每个模块都去导入loguru模块,每个模块都单独去写一遍日志配置,这样麻烦又冗余。

最好的方式是针对项目单独封装、配置一个日志记录模块,作为公共的日志记录器,这既其他模块进行调用,也方便维护。

在loggerController.py中封装的日志记录器,代码及注释示例如下:



from loguru import logger
from datetime import datetime

class ApiAutoLog():
    '''
    利用loguru封装接口自动化项目日志记录器
    '''
    def __new__(cls, *args, **kwargs):
        log_name = datetime.now().strftime("%Y-%m-%d")    # 以时间命名日志文件,格式为"年-月-日"
        sink = "../log/{}.log".format(log_name) # 日志记录文件路径
        level = "DEBUG"  # 记录的最低日志级别为DEBUG
        encoding = "utf-8"  # 写入日志文件时编码格式为utf-8
        enqueue = True # 多线程多进程时保证线程安全
        rotation = "500MB" # 日志文件最大为500MB,超过则新建文件记录日志
        retention = "1 week"    # 日志保留时长为一星期,超时则清除
        logger.add(
            sink=sink, level=level, encoding=encoding,
            enqueue=enqueue, rotation=rotation, retention=retention
        )
        return logger

log = ApiAutoLog()

if __name__ == '__main__':
    log.debug("这是一条debug日志信息")
    log.info("这是一条info日志信息")
    log.warning("这是一条warning日志信息")
    log.critical("这是一条critical日志信息")

这样,在别的地方需要记录日志时,只需导入该模块即可使用,且当天的日志会记录在以指定时间格式命名的.log文件里,如2022-04-05.log。

接下来我们通过调用该日志记录器来记录日志。

二,调用日志记录器记录日志

1. 明确接口自动化需要记录哪些日志

在做接口自动化时,我们首先需要确定测试用例需要记录哪些信息,换句话说,记录哪些日志才有意义?

  • 为了清晰地定位执行了哪条用例,执行时测试用例名称需要记录在日志信息里。
  • 接口的请求参数与返回参数必须记录在日志里,方便定位接口问题。

总之,博主认为,在接口自动化测试中,日志主要记录执行某条用例时对应的请求参数与返回参数即可,当然也可以更细化,这里不做过多说明。

2. 用例中记录日志示例

在明确了测试用例中需记录哪些日志信息后,我们用封装好的日志记录器去记录测试用例执行时的日志。

测试用例模块test_log.py中加入日志记录代码,示例如下:



import requests
import pytest
import json
# 导入封装好的日志记录器
from tools.loggerController import log

# 测试类,仅为示例
class TestLogDemo:
    '''get请求'''
    def test_get_weather_normal(self):
        '''校验百度天气查询接口'''
        url = "https://weathernew.pae.baidu.com/weathernew/pc"
        params = {
            "query": "浙江杭州天气",
            "srcid": 4982
        }
        log.info("请求参数为:{}, {}".format(url, params))
        res = requests.get(url=url, params=params)
        log.info("返回结果为:{}".format(res.text))
        assert res.status_code == 200
        assert "window.tplData" in res.text


# 测试函数,post请求
def test_login_normal():
    '''正确用户名、正确密码登录'''
    url = "http://127.0.0.1:5000/login"
    headers = {"Content-Type": "application/json;charset=utf8"}
    data = {
        "username": "AndyLiu",
        "password": "123456"
    }
    log.info("请求参数为:{}, {}, {}".format(url, headers, data))
    res = requests.post(url=url, json=data, headers=headers)
    log.info("返回结果为:{}".format(res.text))
    # 断言
    assert res.status_code == 200
    assert json.loads(res.text)["token"]


if __name__ == '__main__':
    pytest.main()

用例test_get_weather_normal即请求查询天气接口。用例test_login_normal查询的是自定义接口,该接口构造比较简单,学习过程中没有可用于请求调试的接口,则可以参考文章使用Flask开发简单接口自己开发简单接口。

接下来我们来运行该测试模块test_log.py,结果如下:

用例test_get_weather_normal返回的结果是一大串html文档内容。用例test_login_normal显示在日志文件的最后面,如下所示:

从结果可以看出来,日志文件中记录的日志非常清晰,且使用loguru默认的format格式时,会自动记录日志对应的函数名、方法名。

三,总结

最后我们一起来做个总结,如下:

  • 在实际项目中需要自己封装相应配置的日志记录器用于公共调用,而不是每个模块单独配置使用loguru或者logging。
  • 我们要先明确自动化项目运行过程中需要哪些信息需要记录,然后再在代码中记录对应的内容。
  • 相对于python自带的logging模块,我们进一步看到了loguru模块简单得不可以思议。

最后

这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。欢迎留言,或是关注我的专栏和我交流。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值