diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..c1be9f9 --- /dev/null +++ b/conftest.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# coding=utf-8 + +""" +@author: CNWei,ChenWei +@Software: PyCharm +@contact: t6g888@163.com,chenwei@zygj.com +@file: conftest +@date: 2026/1/16 10:52 +@desc: +""" +import logging + +import pytest +from core.run_appium import start_appium_service, stop_appium_service +from core.driver import AppDriver + + +@pytest.fixture(scope="session") +def app_server(): + """ + 第一层:管理 Appium Server 进程。 + 利用你原本 start_appium_service 里的 40 次轮询和 sys.exit(1) 逻辑。 + """ + # 启动服务 + service = start_appium_service() + yield service + # 所有测试结束,清理进程 + stop_appium_service(service) + + +@pytest.fixture(scope="module") +def driver(app_server): + """ + 第二层:管理 WebDriver 会话。 + 依赖 app_server,确保服务 Ready 后才创建连接。 + """ + # 实例化你提供的类结构 + app_helper = AppDriver() + + # 配置Android设备参数 + capabilities = dict( + platformName='Android', + automationName='uiautomator2', + deviceName='Android', + appPackage='com.android.settings', + appActivity='.Settings' + ) + + # 连接并获取原生 driver 实例 + app_helper.connect(platform="android", caps=capabilities) + + yield app_helper + + # 用例结束,只关 session,不关 server + app_helper.quit() + + +def pytest_exception_interact(node, call, report): + """ + 当测试用例抛出异常(断言失败或代码报错)时,Pytest 会调用这个钩子。 + 我们在这里手动把错误信息喂给 logging。 + """ + # 获取名为 'Error' 的记录器,它会遵循 pytest.ini 中的 log_file 配置 + logger = logging.getLogger("Error") + + if report.failed: + # 获取详细的错误堆栈(包含 assert 的对比信息) + exc_info = call.excinfo.getrepr(style='no-locals') + + logger.error(f"TEST FAILED: {node.nodeid}") + logger.error(f"详细错误信息如下:\n{exc_info}") \ No newline at end of file diff --git a/core/settings.py b/core/settings.py new file mode 100644 index 0000000..c451ef2 --- /dev/null +++ b/core/settings.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +# coding=utf-8 + +""" +@author: CNWei,ChenWei +@Software: PyCharm +@contact: t6g888@163.com,chenwei@zygj.com +@file: settings +@date: 2026/1/19 16:54 +@desc: +""" +import os +# core/settings.py +from pathlib import Path + +# 项目根目录 (core 的上一级) +BASE_DIR = Path(__file__).parent.parent + +# --- 目录配置 --- +OUTPUT_DIR = BASE_DIR / "outputs" +LOG_DIR = OUTPUT_DIR / "logs" +LOG_BACKUP_DIR = LOG_DIR / "backups" +ALLURE_TEMP = BASE_DIR / "temp" +REPORT_DIR = BASE_DIR / "report" + +# 确保必要的目录存在 +for folder in [LOG_DIR, LOG_BACKUP_DIR, ALLURE_TEMP]: + folder.mkdir(parents=True, exist_ok=True) + +# --- 文件路径 --- +LOG_SOURCE = LOG_DIR / "pytest.log" + +# --- 业务常量 (可选) --- +IMPLICIT_WAIT = 10 +APPIUM_SERVER = "http://127.0.0.1:4723" +# --- 核心配置 --- +APPIUM_HOST = "127.0.0.1" +APPIUM_PORT = 4723 + + diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..5b87806 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,22 @@ +[pytest] +addopts = -q --show-capture=no +;addopts = --tb=short +# 1. 开启实时控制台日志 +log_cli = True +log_cli_level = INFO +log_cli_format = %(asctime)s %(levelname)-5s [%(name)s] - %(message)s +log_cli_date_format = %H:%M:%S + +# 2. 开启日志文件记录 +log_file = outputs/logs/pytest.log +log_file_level = INFO +log_file_format = %(asctime)s %(levelname)-5s [%(name)s] %(module)s.%(funcName)s:%(lineno)d - %(message)s +log_file_date_format = %Y-%m-%d %H:%M:%S + +# 3. 基础配置 +# 解决中文测试用例显示为乱码(Unicode)的问题 +disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True + +# 限制 Pytest 搜索范围,提升启动速度 +testpaths = test_cases +python_files = test_*.py \ No newline at end of file