当前位置:   article > 正文

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

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

引言

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

项目中需要日志的原因

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

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

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

loguru 的优势

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

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

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

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

loguru 的封装最佳实践

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

  1. from loguru import logger
  2. import os
  3. # 创建日志目录
  4. log_dir = "logs"
  5. os.makedirs(log_dir, exist_ok=True)
  6. # 配置logger
  7. logger.add(
  8.     f"{log_dir}/app.log",
  9.     rotation="1 week",  # 日志轮转周期
  10.     compression="zip",   # 轮转文件压缩
  11.     level="DEBUG",      # 最低日志级别
  12.     format="{time:YYYY-MM-DD at HH:mm:ss} - {level} - {message}",
  13. )
  14. class CustomLogger:
  15.     def log_info(self, message):
  16.         logger.info(message)
  17.     def log_error(self, message):
  18.         logger.error(message)
  19. # 使用封装的logger
  20. logger = CustomLogger()
  21. logger.log_info("This is an informational message.")

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

自定义日志格式

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

基本示例:

  1. from loguru import logger
  2. # 定义日志格式
  3. log_format = "{time:YYYY-MM-DD at HH:mm:ss} - {level} - {message}"
  4. logger.add("logs/my_app.log"format=log_format)
  5. logger.info("This is an informational message.")

高级格式化:

  1. from loguru import logger
  2. import platform
  3. # 定义更复杂的日志格式,包括额外的字段
  4. log_format = (
  5.     "<level>{level: <8}</level> "
  6.     "<cyan>{time:YYYY-MM-DD HH:mm:ss.SSS}</cyan> "
  7.     "<level>{message}</level> "
  8.     "<green>{function}</green> "
  9.     "<cyan>{file}:{line}</cyan>"
  10. )
  11. logger.add("logs/my_app.log"format=log_format, level="DEBUG")
  12. logger.debug(f"This is a debug message from {platform.system()}.")

结构化日志输出

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

启用结构化日志:

  1. from loguru import logger
  2. # 定义日志格式为JSON
  3. logger.add("logs/my_app.json"format="{time} {level} {message}", serialize=True)
  4. logger.info("This is a structured log message.")

自定义结构化日志格式:

  1. from loguru import logger
  2. # 定义一个自定义的日志记录器
  3. def custom_format(record):
  4.     return {
  5.         "timestamp"record["time"],
  6.         "level"record["level"].name,
  7.         "message"record["message"],
  8.         "extra"record["extra"],
  9.     }
  10. logger.add("logs/my_app_custom.json"format=custom_format, serialize=True)
  11. logger.info("This is a custom structured log message.", extra={"user_id"42})

处理日志中的异常

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

捕获异常:

  1. from loguru import logger
  2. logger.add("logs/my_app.log", backtrace=True, diagnose=True)
  3. try:
  4.     1 / 0
  5. except Exception as e:
  6.     logger.error("An error occurred", exc_info=True)

多文件和多处理器日志

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

多文件日志:

  1. from loguru import logger
  2. logger.add("logs/debug.log", level="DEBUG"format="{time} {level} {message}", rotation="1 week")
  3. logger.add("logs/info.log", level="INFO"format="{time} {level} {message}", rotation="1 month")
  4. logger.debug("This is a debug message.")
  5. logger.info("This is an info message.")

多处理器日志:

  1. from loguru import logger
  2. logger.add("logs/my_app.log", enqueue=True)
  3. logger.info("This is a log message from a multi-processor environment.")

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

基本旋转策略

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

  1. from loguru import logger
  2. # 设置日志文件的最大大小为10MB
  3. logger.add("logs/my_app.log", rotation="10 MB")
  4. # 设置日志文件每天旋转一次
  5. logger.add("logs/my_app.log", rotation="1 day")

高级旋转策略

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

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

保留策略

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

  1. from loguru import logger
  2. from datetime import timedelta
  3. # 设置旧日志文件保留7
  4. logger.add("logs/my_app.log", retention="7 days")
  5. # 使用函数设置保留策略
  6. def retention_policy():
  7.     return timedelta(days=7)
  8. logger.add("logs/my_app.log", retention=retention_policy)

压缩策略

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

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

综合示例

  1. from loguru import logger
  2. # 综合使用日志旋转、保留和压缩策略
  3. logger.add(
  4.     "logs/my_app.log",
  5.     rotation="1 week 100 MB",  # 每周或文件达到100MB时旋转
  6.     retention="30 days",        # 保留30天的日志
  7.     compression="tar.gz"       # 使用tar.gz格式压缩旧日志文件
  8. )
  9. logger.info("This is a log message with rotation, retention, and compression.")

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

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

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

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

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

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

  1. from allure import allure_report
  2. @allure_report(test_case_name="API Endpoint Test")
  3. def test_api_with_allure():
  4.     try:
  5.         logger.log_info("Starting API test case.")
  6.         # 测试逻辑
  7.         response = requests.get("http://api.example.com/data")
  8.         assert response.status_code == 200
  9.     except AssertionError as e:
  10.         allure.attach.body(str(response.content), name="Response Content"type="text")
  11.         logger.log_error(f"Allure attached response content on failure.")
  12.         raise e
  13.     except Exception as e:
  14.         allure.attach.body(str(e), name="Error Details"type="text")
  15.         logger.log_error(f"Allure attached error details on exception.")
  16.         raise e
  17.     finally:
  18.         logger.log_info("API test case completed.")

结论

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

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

软件测试面试文档

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/902793?site
推荐阅读
相关标签
  

闽ICP备14008679号