Bootstrap

loguru日志模块:简化Python自动化测试的日志管理!

引言

日志是软件开发中的关键组成部分,为开发和测试人员提供了调试和监控应用程序的重要手段。loguru 是一个第三方的 Python 日志库,以其简洁的 API 和自动化的功能脱颖而出。本文将探讨为什么项目中需要日志,loguru 为何受到青睐,以及如何封装和在接口自动化测试项目中使用 loguru,同时结合 Allure 生成丰富的测试报告。

项目中需要日志的原因

  • 问题诊断:记录程序运行时的状态,便于问题诊断。

  • 监控和审计:监控应用程序的行为,进行安全审计。

  • 性能分析:记录性能指标,帮助分析和优化性能瓶颈。

loguru 的优势

  • 简洁的 API:loguru 提供了简洁直观的 API,简化了日志记录。

  • 自动化功能:自动处理日志文件的轮转和格式。

  • 高性能:相比标准的 logging 库,loguru 在性能上进行了优化。

  • 易于集成:快速集成到现有项目中,与测试框架协同工作。

loguru 的封装最佳实践

以下是一个 loguru 封装的示例,展示如何创建一个日志记录器并配置其行为:

from loguru import logger
import os

# 创建日志目录
log_dir = "logs"
os.makedirs(log_dir, exist_ok=True)

# 配置logger
logger.add(
    f"{log_dir}/app.log",
    rotation="1 week",  # 日志轮转周期
    compression="zip",   # 轮转文件压缩
    level="DEBUG",      # 最低日志级别
    format="{time:YYYY-MM-DD at HH:mm:ss} - {level} - {message}",
)

class CustomLogger:
    def log_info(self, message):
        logger.info(message)

    def log_error(self, message):
        logger.error(message)

# 使用封装的logger
logger = CustomLogger()
logger.log_info("This is an informational message.")

下面是关于 loguru 的一些高级用法,结合项目需要可使用:

自定义日志格式

loguru 允许你通过 format 参数在 logger.add()方法中定义日志的输出格式。你可以使用字符串格式化来包含日志的时间、级别、消息等。

基本示例:

from loguru import logger

# 定义日志格式
log_format = "{time:YYYY-MM-DD at HH:mm:ss} - {level} - {message}"
logger.add("logs/my_app.log", format=log_format)

logger.info("This is an informational message.")

高级格式化:

from loguru import logger
import platform

# 定义更复杂的日志格式,包括额外的字段
log_format = (
    "<level>{level: <8}</level> "
    "<cyan>{time:YYYY-MM-DD HH:mm:ss.SSS}</cyan> "
    "<level>{message}</level> "
    "<green>{function}</green> "
    "<cyan>{file}:{line}</cyan>"
)

logger.add("logs/my_app.log", format=log_format, level="DEBUG")

logger.debug(f"This is a debug message from {platform.system()}.")

结构化日志输出

结构化日志是一种将日志数据输出为结构化格式(如 JSON)的方式,这使得日志更易于被机器解析和处理。

启用结构化日志:

from loguru import logger

# 定义日志格式为JSON
logger.add("logs/my_app.json", format="{time} {level} {message}", serialize=True)

logger.info("This is a structured log message.")

自定义结构化日志格式:

from loguru import logger

# 定义一个自定义的日志记录器
def custom_format(record):
    return {
        "timestamp": record["time"],
        "level": record["level"].name,
        "message": record["message"],
        "extra": record["extra"],
    }

logger.add("logs/my_app_custom.json", format=custom_format, serialize=True)

logger.info("This is a custom structured log message.", extra={"user_id": 42})

处理日志中的异常

loguru 可以自动处理日志中的异常,并将异常信息以结构化格式输出。

捕获异常:

from loguru import logger

logger.add("logs/my_app.log", backtrace=True, diagnose=True)

try:
    1 / 0
except Exception as e:
    logger.error("An error occurred", exc_info=True)

多文件和多处理器日志

loguru 还支持将日志输出到多个文件,并且是多处理器安全的。

多文件日志:

from loguru import logger

logger.add("logs/debug.log", level="DEBUG", format="{time} {level} {message}", rotation="1 week")
logger.add("logs/info.log", level="INFO", format="{time} {level} {message}", rotation="1 month")

logger.debug("This is a debug message.")
logger.info("This is an info message.")

多处理器日志:

from loguru import logger

logger.add("logs/my_app.log", enqueue=True)

logger.info("This is a log message from a multi-processor environment.")

通过这些方法,你可以灵活地定制 loguru 的日志输出格式和结构,使其满足你的项目需求。

基本旋转策略

loguru 使用 rotation 参数来设置日志旋转的策略。你可以指定日志文件的最大大小或旋转的时间间隔。

from loguru import logger

# 设置日志文件的最大大小为10MB
logger.add("logs/my_app.log", rotation="10 MB")

# 设置日志文件每天旋转一次
logger.add("logs/my_app.log", rotation="1 day")

高级旋转策略

你可以结合使用大小和时间来设置更复杂的旋转策略。

from loguru import logger

# 设置日志文件每5天或达到100MB时旋转一次
logger.add("logs/my_app.log", rotation="5 days 100 MB")

保留策略

使用 retention 参数,你可以设置旧日志文件的最长保留时间。这可以是具体的时间长度,如"1 week"、"2 months",或者是一个函数,该函数返回一个 datetime.timedelta 对象。

from loguru import logger
from datetime import timedelta

# 设置旧日志文件保留7天
logger.add("logs/my_app.log", retention="7 days")

# 使用函数设置保留策略
def retention_policy():
    return timedelta(days=7)

logger.add("logs/my_app.log", retention=retention_policy)

压缩策略

loguru 还允许你设置日志文件在旋转后是否需要压缩,以及使用哪种压缩格式。这通过 compression 参数设置。

from loguru import logger

# 设置日志文件在旋转后使用gzip压缩
logger.add("logs/my_app.log", compression="gz")

综合示例

from loguru import logger

# 综合使用日志旋转、保留和压缩策略
logger.add(
    "logs/my_app.log",
    rotation="1 week 100 MB",  # 每周或文件达到100MB时旋转
    retention="30 days",        # 保留30天的日志
    compression="tar.gz"       # 使用tar.gz格式压缩旧日志文件
)

logger.info("This is a log message with rotation, retention, and compression.")

通过这些设置,你可以确保日志文件不会无限增长,同时旧的日志文件可以被适当地保留和压缩,从而节省存储空间并便于日志管理。

在接口自动化测试项目中调用封装好的 loguru

在自动化测试项目中,可以在测试用例执行前后调用 loguru 记录日志:

def test_api_endpoint():
    try:
        logger.log_info("Testing API endpoint.")
        # API调用逻辑
        response = requests.get("http://api.example.com/data")
        assert response.status_code == 200
        logger.log_info("API response received successfully.")
    except AssertionError as e:
        logger.log_error(f"Test failed with status code: {response.status_code}")
    except Exception as e:
        logger.log_error(f"An unexpected error occurred: {e}")

测试用例执行失败或执行异常时结合 loguru 和 Allure

当测试用例执行失败或出现异常时,可以将 loguru 记录的日志与 Allure 报告结合,提供更丰富的测试结果信息:

from allure import allure_report

@allure_report(test_case_name="API Endpoint Test")
def test_api_with_allure():
    try:
        logger.log_info("Starting API test case.")
        # 测试逻辑
        response = requests.get("http://api.example.com/data")
        assert response.status_code == 200
    except AssertionError as e:
        allure.attach.body(str(response.content), name="Response Content", type="text")
        logger.log_error(f"Allure attached response content on failure.")
        raise e
    except Exception as e:
        allure.attach.body(str(e), name="Error Details", type="text")
        logger.log_error(f"Allure attached error details on exception.")
        raise e
    finally:
        logger.log_info("API test case completed.")

结论

loguru 以其简洁的 API 和自动化功能简化了日志记录过程,与 Allure 结合使用,可以为自动化测试提供详细的问题诊断信息和丰富的报告内容,提高测试的可追踪性和可维护性。鼓励开发者和测试工程师采用 loguru 进行日志记录,并与 Allure 报告结合,以提升自动化测试项目的日志管理和报告生成能力。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

;