# -*- coding: utf-8 -*- """ @Time : 2025/7/30 10:58 @Auth : 九月的海 @File : conftest.py.py @IDE : PyCharm @Motto : Catch as catch can.... """ # conftest.py import pytest import logging import time import json from pathlib import Path from api_auto_framework.core.request_wrapper import RequestWrapper # ========================== 全局日志配置 ========================== def configure_logger(name): """配置全局日志记录器""" logger = logging.getLogger(name) logger.setLevel(logging.INFO) # 创建一个流处理器(控制台输出) stream_handler = logging.StreamHandler() # 创建格式器并添加到处理器 formatter = logging.Formatter( '%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) stream_handler.setFormatter(formatter) # 确保只添加一个处理器 if not logger.hasHandlers(): logger.addHandler(stream_handler) return logger # ========================== 公共函数定义 ========================== def log_request_details(test_data, logger): """记录请求详细信息到日志""" logger.info(f"测试名称: {test_data['test_name']}") logger.info(f"请求方法: {test_data['method']}") logger.info(f"请求URL: {test_data['url']}") if "headers" in test_data and test_data["headers"]: logger.info("请求头:") for k, v in test_data["headers"].items(): logger.info(f" {k}: {v}") if "cookies" in test_data and test_data["cookies"]: logger.info("Cookies:") for k, v in test_data["cookies"].items(): logger.info(f" {k}: {v}") if "body" in test_data and test_data.get("body"): logger.info("请求体:" + test_data.get("body")) else: logger.info(" 无请求体") def log_response_details(response, logger): """记录响应详细信息到日志""" result = RequestWrapper.formatted_response(response) logger.info(f"响应状态码: {result['status_code']}") body_data = result.get("body", {}) logger.info(f"响应数据: {body_data}") return result # ========================== Fixture定义 ========================== @pytest.fixture(scope="session") def api_logger(request): """为每个测试提供专用日志记录器""" logger_name = f"test_{request.node.name}" return configure_logger(logger_name) @pytest.fixture(scope="session") def log_assert(api_logger): """带有日志记录的断言函数""" def wrapper(condition, success_msg, fail_msg, actual_value=None, expected_value=None): if condition: api_logger.info(f"✔ PASS: {success_msg}") if actual_value is not None and expected_value is not None: api_logger.info(f" 实际值: {actual_value} | 期望值: {expected_value}") else: api_logger.error(f"✖ FAIL: {fail_msg}") if actual_value is not None and expected_value is not None: api_logger.error(f" 实际值: {actual_value} | 期望值: {expected_value}") # 触发实际断言 assert condition, fail_msg return wrapper @pytest.fixture(scope="session") def setup_teardown(request, api_logger): """测试的前置和后置操作""" # 前置操作 api_logger.info(f"======= 开始测试: {request.node.name} =======") start_time = time.time() yield # 后置操作 end_time = time.time() duration = end_time - start_time api_logger.info(f"测试执行时长: {duration:.2f}秒") api_logger.info(f"======= 结束测试: {request.node.name} =======")