pytest框架增加log打印(包括pytest的执行结果、自定义的log信息)

前言:
之前同事在跑脚本的时候报错了,发现没法把需要的log信息打印出来,我这边定位问题比较麻烦,所以增加了log的打印。这个问题之前已经处理过了,本来以为是小问题,结果今天又要用到这个小技巧的时候居然想不起来了,还得去翻代码(忘性越来越大了( ̄_ ̄|||)想想还是决定把它记录下来,并且总结一下相关知识点。

需要解决的问题:

  1. 代码里添加的logging模块的报错信息不打印
  2. 没法打印pytest的报错信息
  3. 某个功能添加了try...except去捕获异常,打印了自定义的报错信息,捕获异常之后让用例fail,并打印原有的报错信息

处理方法:

一、 使用pytest_runtest_makereport方法打印 pytest的故障信息和用例执行结果

  1. 添加conftest.py文件
  2. 写pytest_runtest_makereport方法
import os
import pytest
import logging

@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    out = yield
    res = out.get_result()
    print(res)
    if res.when == "call":
        logging.info(f"item:{item}")
        logging.info(f"异常:{call.excinfo}")
        logging.info(f"故障表示:{res.longrepr}")
        logging.info(f"测试结果:{res.outcome}")
        logging.info(f"用例耗时:{res.duration}")
        logging.info("**************************************")

相关知识点:

  1. pytest_runtest_makereport(item, call)是pytest带有的钩子函数
    测试用例的执行结果会自动跳到这个函数,在这个函数下可以编辑代码进行一些操作
    item为用例对象
    call为用例的测试步骤(pytest的执行流程为 setup -> call ->teardown)
  2. res.longrepr 返回的是pytest的报错信息,通过打印这个值,可以像在控制台一样获取报错的文件行号等信息

二、 添加log文件,使得报错信息打印在本地log文件中

  1. conftest.py文件中写pytest_configure方法,设置log文件路径
  2. pytest.ini文件中 设置log的级别、格式等信息
# conftest.py
def pytest_configure(config):
    config.option.log_file = os.path.join(config.rootdir, 'log', 'log.log')

相关知识点:

  1. config.rootdir 为项目的根目录
# pytest.ini 
[pytest]
log_cli = 1
log_cli_level = INFO
log_cli_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)
log_cli_date_format = %Y-%m-%d %H:%M:%S
log_file_level = INFO
log_file_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)
log_file_date_format = %Y-%m-%d %H:%M:%S

相关知识点:

  1. log_cli = 1 输出日志到控制台
  2. log_cli_level = INFO 设置控制台日志级别,注意:这里设置之后,脚本文件里设置的导入logging模块, logging.basicConfig(level=logging.DEBUG)设置的日志级别就不起作用了
  3. log_cli_format 设置控制台日志格式
  4. log_cli_date_format 设置控制台输出的时间格式
  5. log_file_format 设置输出到log文件的日志格式
  6. log_file_date_format 设置输出到log文件的时间格式

三、 在脚本文件中try...except捕获错误,打印需要的信息后,再把这个错误暴露出来,让这条用例failed

  1. 如果不try...except的话,pytest返回的报错信息为代码的错误信息,但是没法显示出给出想要的提示信息

  2. 通过try...except之后,代码就不会报错,错误就会被隐藏,所以必须让pytest报错,并且把原先代码的错误信息显示出来

# 这部分是我自己的脚本代码,就简单举个例子

def mycode:
    a = 3
    b = [1,2]
    try:
        out = b[a]
    except IndexError as e:  # 捕获异常,并把报错信息存在 e 中
        loggging.error(f"列表b的长度不够,需要先把b的长度扩展到{a}个元素")  # 打印自己想要的提示信息
        pytest.fail(str(e))  # 再把这个报错暴露出来,打印捕获到的报错信息
posted @ 2022-07-17 13:06  丛影HHZ  阅读(2285)  评论(0编辑  收藏  举报