# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName:   test67
# FileName:      __init__.py
# Author:       lao_zhao
# Datetime:     2025/6/13 14:17
# Description:
# 
# ---------------------------------------------------------------------------
import functools
import logging
import os
import time


def get_logger(log_file):
    """获取日志文件的logger"""
    logger = logging.getLogger()
    logger.level = logging.INFO
    handler = logging.FileHandler(log_file, mode="a", encoding="utf-8")
    formatter = logging.Formatter('%(asctime)s - %(levelname)s: %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    return logger


log_dir = os.path.join(os.path.join(os.path.dirname(__file__), "report"), "log")
log_name = "BPM_" + time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime()) + ".log"
log_path = os.path.join(log_dir, log_name)

log = get_logger(log_path)


def log_decorator(param):
    @functools.wraps(param)  # 被装饰对象使用原来的名称
    def inner(*args, **kwargs):
        # __code__是对象的代码属性
        log.info(
            f"执行功能的描述：{param.__doc__},功能为：{param.__name__}，所在的文件为：{param.__code__.co_filename}, 所在的行为：{param.__code__.co_firstlineno}")
        try:
            value = param(*args, **kwargs)
        except Exception as e:
            log.error(
                f"执行功能的描述：{param.__doc__},功能为：{param.__name__}, 报错，传入的形参为：{args}或{kwargs}, 错误的描述为：{e}, 错误的类型为：{type(e)}，所在的文件为：{param.__code__.co_filename}, 所在的行为：{param.__code__.co_firstlineno}")
            raise e
        else:
            return value

    return inner


"""
    pytest输出报告：
        1：pytest-html插件输出报告。pip install pytest-html
            pytest -vv 用例模块 --html=报告存放的路径
            pytest -vv 用例模块 --html=报告存放的路径 --self-contained-html
                -vv: 在终端输出用例执行的结果
                --self-contained-html：生成独立的html报告
                
        2: 失败重跑插件：pip install pytest-rerunfailures
            --reruns 失败重跑的次数 --reruns-delay 每次失败重跑的间隔时间
            
        3: 使用allure生成报告。下载allure插件: pip install allure-pytest
            第一步：将用例执行的结果生成json文件.
                pytest 用例模块 --alluredir=json文件存放的路径 --clean-alluredir
            第二步：根据第一步生成的json文件生成报告。
                i: 生成报告的服务(web服务)：allure serve 第一步保存的json文件路径
                ii: 生成静态报告。
                    allure generate 第一步保存的json文件路径 -o 静态报告存放的路径
                    静态报告的查看：allure open 静态报告存放的路径
"""
