diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..b568ab6 --- /dev/null +++ b/conftest.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +# @Version: Python 3.9 +# @Time : 2023/2/2 16:05 +# @Author : chenyinhua +# @File : conftest.py +# @Software: PyCharm +# @Desc: 这是文件的描述信息 + +# 标准库导入 +import time +import os +from datetime import datetime +# 第三方库导入 +from loguru import logger +# 本地应用/模块导入 +from settings import REPORT_DIR, CUSTOM_MARKERS + + +# ------------------------------------- START: pytest钩子函数处理---------------------------------------# +def pytest_configure(config): + """ + 注册自定义标记 + """ + # 注册自定义标记 + logger.debug(f"需要注册的标记:{CUSTOM_MARKERS}") + # 对标记进行去重处理 + unique_markers = [] + for item in CUSTOM_MARKERS: + if item not in unique_markers: + unique_markers.append(item) + # 注册标记 + for custom_marker in unique_markers: + if isinstance(custom_marker, str): + config.addinivalue_line('markers', f'{custom_marker}') + elif isinstance(custom_marker, dict): + for k, v in custom_marker.items(): + config.addinivalue_line('markers', f'{k}:{v}') + + +def pytest_terminal_summary(terminalreporter, config): + """ + 收集测试结果 + """ + _RERUN = len([i for i in terminalreporter.stats.get('rerun', []) if i.when != 'teardown']) + try: + # 获取pytest传参--reruns的值 + reruns_value = int(config.getoption("--reruns")) + _RERUN = int(_RERUN / reruns_value) + except Exception: + reruns_value = "未配置--reruns参数" + _RERUN = len([i for i in terminalreporter.stats.get('rerun', []) if i.when != 'teardown']) + + _PASSED = len([i for i in terminalreporter.stats.get('passed', []) if i.when != 'teardown']) + _ERROR = len([i for i in terminalreporter.stats.get('error', []) if i.when != 'teardown']) + _FAILED = len([i for i in terminalreporter.stats.get('failed', []) if i.when != 'teardown']) + _SKIPPED = len([i for i in terminalreporter.stats.get('skipped', []) if i.when != 'teardown']) + _XPASSED = len([i for i in terminalreporter.stats.get('xpassed', []) if i.when != 'teardown']) + _XFAILED = len([i for i in terminalreporter.stats.get('xfailed', []) if i.when != 'teardown']) + + _TOTAL = terminalreporter._numcollected + + _DURATION = time.time() - terminalreporter._sessionstarttime + + session_start_time = datetime.fromtimestamp(terminalreporter._sessionstarttime) + _START_TIME = f"{session_start_time.year}年{session_start_time.month}月{session_start_time.day}日 " \ + f"{session_start_time.hour}:{session_start_time.minute}:{session_start_time.second}" + + test_info = f"各位同事, 大家好:\n" \ + f"自动化用例于 {_START_TIME}- 开始运行,运行时长:{_DURATION:.2f} s, 目前已执行完成。\n" \ + f"--------------------------------------\n" \ + f"#### 执行结果如下:\n" \ + f"- 用例运行总数: {_TOTAL} 个\n" \ + f"- 跳过用例个数(skipped): {_SKIPPED} 个\n" \ + f"- 实际执行用例总数: {_PASSED + _FAILED + _XPASSED + _XFAILED} 个\n" \ + f"- 通过用例个数(passed): {_PASSED} 个\n" \ + f"- 失败用例个数(failed): {_FAILED} 个\n" \ + f"- 异常用例个数(error): {_ERROR} 个\n" \ + f"- 重跑的用例数(--reruns的值): {_RERUN} ({reruns_value}) 个\n" + try: + _RATE = (_PASSED + _XPASSED) / (_PASSED + _FAILED + _XPASSED + _XFAILED) * 100 + test_result = f"- 用例成功率: {_RATE:.2f} %\n" + logger.success(f"{test_info}{test_result}") + except ZeroDivisionError: + test_result = "- 用例成功率: 0.00 %\n" + logger.critical(f"{test_info}{test_result}") + + # 这里是方便在流水线里面发送测试结果到钉钉/企业微信的 + with open(file=os.path.join(REPORT_DIR, "test_result.txt"), mode="w", encoding="utf-8") as f: + f.write(f"{test_info}{test_result}") + +# ------------------------------------- END: pytest钩子函数处理---------------------------------------#