diff --git a/.gitignore b/.gitignore
index fbf1cef..b22ab4a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,6 +20,7 @@ Reports/allure-results/
Reports/allure-report/
Reports/api-results/
Reports/ui-results/
+Reports/platform/
Reports/logs/
UI_Automation/screenshots/
*.log
@@ -58,7 +59,12 @@ allure-results-history/
config/local.yml
# ==================== Web UI 运行产物 ====================
+Reports/webui-runs/
Reports/webui-runs/*/logs.txt
Reports/webui-runs/*/allure-results/
Reports/webui-runs/*/allure-report/
tools/webui/.env
+
+# ==================== Local Playwright probes ====================
+recon.py
+test_basic.py
diff --git a/README.md b/README.md
index d26ec4c..e7c006c 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,11 @@
## 📋 项目简介
-本项目是一个完整的 **iOS 移动端自动化测试框架**,以**云鹿商城 App** 为测试对象,实现了 **UI 自动化测试**、**接口自动化测试**、**性能测试** 三位一体的测试解决方案,并内置 **Web 控制台**,支持在浏览器中浏览代码、执行测试、查看实时日志和 Allure 报告。
+本项目是一个完整的 **iOS 移动端自动化测试工程**,以**云鹿商城 App** 为测试对象,实现了 **UI 自动化测试**、**接口自动化测试**、**性能测试** 三位一体的测试解决方案。
+
+它在通用测试平台体系中的定位是:**测试代码载体和第一个接入样板**。本仓库负责“怎么测”,例如 pytest/Appium 用例、Page Object、测试数据、断言和报告输出;通用平台和 Local Agent 负责“谁来调度、在哪里执行、如何回传结果”。
+
+内置的 `tools/webui` 仅作为单项目本地 Demo 控制台,用于浏览代码、执行测试、查看实时日志和 Allure 报告,不承担平台中心或通用 Agent 职责。
### 核心特性
@@ -22,7 +26,8 @@
| 📈 **Allure 报告** | 可视化测试报告,支持历史趋势 |
| 🔄 **GitHub Actions CI** | 自动化流水线,PR 触发执行 |
| ⚡ **性能测试** | 基于 Locust 的压力测试脚本 |
-| 🌐 **Web 控制台** | 本地 Web UI,支持代码浏览、测试执行、AI 问答 |
+| 🌐 **本地 Demo 控制台** | 本地 Web UI,支持代码浏览、测试执行、AI 问答 |
+| 🔗 **平台接入协议** | 通过 `test-platform.yml` 描述套件、命令、依赖和产物路径 |
---
@@ -37,7 +42,7 @@ graph TD
B & C & D --> E[🛠️ 基础设施层
Config / Logger / Utils]
E --> F[🚀 CI/CD 层
GitHub Actions / Fastlane]
- E --> G[🌐 Web 控制台
FastAPI + Alpine.js]
+ E --> G[🌐 本地 Demo 控制台
FastAPI + Alpine.js]
```
---
@@ -47,6 +52,7 @@ graph TD
```
iOS-Automation-Framework/
├── README.md # Project documentation
+├── test-platform.yml # TestPlatform suite contract
├── requirements.txt # Python dependencies
├── pytest.ini # pytest configuration
├── conftest.py # Global fixtures
@@ -122,7 +128,7 @@ iOS-Automation-Framework/
│ └── allure-report/ # Allure HTML 报告
│
├── tools/ # 工具目录
-│ └── webui/ # Web 控制台
+│ └── webui/ # 本地 Demo 控制台
│ ├── app.py # FastAPI 主入口
│ ├── config.py # 配置(读取环境变量)
│ ├── models.py # Run 任务模型
@@ -138,7 +144,8 @@ iOS-Automation-Framework/
│ └── index.html # Alpine.js 单页前端
│
└── docs/ # Documentation
- └── design.md # Design notes
+ ├── design.md # Design notes
+ └── platform-integration.md # TestPlatform integration notes
```
| 目录 | 说明 |
@@ -150,7 +157,9 @@ iOS-Automation-Framework/
| `Performance/` | Locust 性能压测脚本 |
| `CI/` | GitHub Actions / Fastlane 配置 |
| `Reports/` | Allure 报告输出目录,webui-runs/ 存放 Web UI 运行记录 |
-| `tools/webui/` | Web 控制台:代码浏览、测试执行、AI 问答 |
+| `test-platform.yml` | 平台接入协议:声明项目、套件、命令、依赖和产物路径 |
+| `tools/webui/` | 本地 Demo 控制台:代码浏览、测试执行、AI 问答 |
+| `docs/platform-integration.md` | 与 TestPlatform / Local Agent 的职责边界和接入说明 |
---
@@ -212,11 +221,37 @@ cd Performance/locust_scripts
locust -f locustfile.py --host=https://api-dev.yunlu.com
```
+### 平台接入执行
+
+通用平台或 Local Agent 应读取仓库根目录的 `test-platform.yml`,根据任务选择 suite 并执行其中的命令。
+
+示例:
+
+```bash
+# 平台任务 task_id=local-demo-001 时,API 全量套件可写入固定产物目录
+python -m pytest API_Automation/cases -v --alluredir=Reports/platform/local-demo-001/allure-results
+
+# UI 套件由 Local Agent 负责准备 Appium、设备和 ipa/app 包路径
+python -m pytest UI_Automation/Tests -v -n 0 --alluredir=Reports/platform/local-demo-001/allure-results
+```
+
+平台触发的运行建议统一输出到:
+
+```text
+Reports/platform/{task_id}/
+├── logs.txt
+├── allure-results/
+├── allure-report/
+└── screenshots/
+```
+
+被测 `.ipa` / `.app` 包应作为平台任务参数传入,例如 `app_path` 或 `app_url`。本仓库不负责构建 App,也不负责通用任务调度。
+
---
-## 🌐 Web 控制台
+## 🌐 本地 Demo 控制台
-内置本地 Web UI,无需命令行即可浏览代码、执行测试、查看实时日志和 Allure 报告。
+内置本地 Web UI,无需命令行即可浏览代码、执行测试、查看实时日志和 Allure 报告。它只用于本仓库本地调试和演示,不是通用测试平台。
### 启动
@@ -270,6 +305,7 @@ cp tools/webui/.env.example tools/webui/.env
- iOS UI 测试需要 **macOS + Xcode + Appium**,Windows/Linux 下 UI 模块自动禁用
- Web UI 仅供本地单用户 Demo 使用,不适合生产部署
+- 通用 Local Agent 应放在 TestPlatform 侧,本仓库只暴露测试套件和执行命令
- 接入真实 AI 需设置 `AI_PROVIDER=claude` 和 `AI_API_KEY`
### 为什么选择 Page Object 模式?
diff --git a/docs/platform-integration.md b/docs/platform-integration.md
new file mode 100644
index 0000000..bb8b0f8
--- /dev/null
+++ b/docs/platform-integration.md
@@ -0,0 +1,64 @@
+# Test Platform Integration
+
+This repository is a test project, not the test platform itself.
+
+It provides the automation code and suite metadata that a platform-side Local Agent can execute. The platform is responsible for task creation, scheduling, executor management, report indexing, and AI analysis.
+
+## Responsibilities
+
+This repository owns:
+
+- API automation tests under `API_Automation/`.
+- iOS UI automation tests under `UI_Automation/`.
+- Performance scripts under `Performance/`.
+- Test data, page objects, fixtures, and assertions.
+- `test-platform.yml`, which describes executable suites and required capabilities.
+
+This repository does not own:
+
+- Multi-project management.
+- Platform authentication or authorization.
+- Platform database tables.
+- Generic task scheduling.
+- Generic Local Agent implementation.
+- Long-term executor lifecycle management.
+
+## Execution Model
+
+```text
+TestPlatform
+ -> creates a task with project, suite, environment, and optional app artifact
+
+Local Agent
+ -> reads test-platform.yml
+ -> downloads or locates the ipa/app artifact when needed
+ -> runs the selected suite command
+ -> collects logs, screenshots, and Allure results
+ -> uploads results back to TestPlatform
+
+iOS-Automation-Framework
+ -> contains the test code and produces test outputs
+```
+
+## App Artifacts
+
+UI suites can test an app package passed by the platform as:
+
+- `app_path`: local `.ipa` or `.app` path.
+- `app_url`: remote artifact URL downloaded by the Local Agent.
+
+The test code should read the final local app path from local configuration or environment variables prepared by the Local Agent.
+
+## Output Convention
+
+Platform-triggered runs should write outputs under:
+
+```text
+Reports/platform/{task_id}/
+├── logs.txt
+├── allure-results/
+├── allure-report/
+└── screenshots/
+```
+
+The Local Agent owns log capture and upload. This repository only needs to make sure suite commands can write deterministic report paths.
diff --git a/test-platform.yml b/test-platform.yml
new file mode 100644
index 0000000..99d9973
--- /dev/null
+++ b/test-platform.yml
@@ -0,0 +1,100 @@
+schema_version: 1
+
+project:
+ key: yunlu-ios
+ name: Yunlu iOS automation tests
+ description: API, iOS UI, and performance automation suites for Yunlu Mall.
+ type: mobile_app_tests
+
+repository:
+ role: test_repository
+ framework:
+ - pytest
+ - appium
+ - locust
+ - allure
+ platform:
+ - ios
+
+artifacts:
+ default_root: Reports/platform
+ allure_results: Reports/platform/{task_id}/allure-results
+ allure_report: Reports/platform/{task_id}/allure-report
+ logs: Reports/platform/{task_id}/logs.txt
+ screenshots: Reports/platform/{task_id}/screenshots
+
+parameters:
+ app_path:
+ description: Local ipa/app path or downloaded artifact path used by UI suites.
+ required: false
+ app_url:
+ description: Remote ipa/app artifact URL. The Local Agent should download it before running UI suites.
+ required: false
+ environment:
+ description: Target test environment, such as dev, staging, or prod.
+ required: true
+ default: staging
+
+suites:
+ - id: api_smoke
+ name: API smoke tests
+ type: api
+ command: python -m pytest API_Automation/cases -v -m smoke --alluredir=Reports/platform/{task_id}/allure-results
+ report:
+ allure: true
+ outputs:
+ allure_results: Reports/platform/{task_id}/allure-results
+
+ - id: api_all
+ name: API full regression
+ type: api
+ command: python -m pytest API_Automation/cases -v --alluredir=Reports/platform/{task_id}/allure-results
+ report:
+ allure: true
+ outputs:
+ allure_results: Reports/platform/{task_id}/allure-results
+
+ - id: ios_ui_smoke
+ name: iOS UI smoke tests
+ type: ui
+ command: python -m pytest UI_Automation/Tests -v -n 0 -m smoke --alluredir=Reports/platform/{task_id}/allure-results
+ requires:
+ - macos
+ - xcode
+ - appium
+ - ios_device_or_simulator
+ accepts_artifact:
+ - ipa
+ - app
+ report:
+ allure: true
+ outputs:
+ allure_results: Reports/platform/{task_id}/allure-results
+ screenshots: Reports/platform/{task_id}/screenshots
+
+ - id: ios_ui_all
+ name: iOS UI full regression
+ type: ui
+ command: python -m pytest UI_Automation/Tests -v -n 0 --alluredir=Reports/platform/{task_id}/allure-results
+ requires:
+ - macos
+ - xcode
+ - appium
+ - ios_device_or_simulator
+ accepts_artifact:
+ - ipa
+ - app
+ report:
+ allure: true
+ outputs:
+ allure_results: Reports/platform/{task_id}/allure-results
+ screenshots: Reports/platform/{task_id}/screenshots
+
+ - id: performance_all
+ name: Performance tests
+ type: performance
+ command: locust -f Performance/locust_scripts/locustfile.py --headless
+ requires:
+ - network
+ report:
+ allure: false