feat(T-001): 初始化 Python 项目骨架
- 建立 src/(main.py 最小可运行入口)、tests/(unittest 冒烟测试)、requirements.txt。 - 骨架阶段测试用标准库 unittest,零第三方依赖;pytest 留待后续按需引入。 - 文档占位符验证命令替换为真实命令(pytest -> unittest discover)。 - 同步 tasks.md(T-001 DONE)、progress.md、current-state.md。 验证:compileall OK;unittest 2 passed;python src/main.py exit=0。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
541dfab967
commit
2863bf2750
@@ -18,7 +18,7 @@
|
|||||||
4. [`04-architecture.md`](04-architecture.md):系统结构、职责划分、数据模型和关键难点。
|
4. [`04-architecture.md`](04-architecture.md):系统结构、职责划分、数据模型和关键难点。
|
||||||
5. [`05-coding-rules.md`](05-coding-rules.md):写代码前必须遵守的规则。
|
5. [`05-coding-rules.md`](05-coding-rules.md):写代码前必须遵守的规则。
|
||||||
6. [`../tasks.md`](../tasks.md):领取本轮唯一任务。
|
6. [`../tasks.md`](../tasks.md):领取本轮唯一任务。
|
||||||
7. [current-state.md](current-state.md):当前代码现实、可运行命令、下一步入口。
|
7. [current-state.md](current-state.md):当前代码现实、可运行命令、下一步入口。
|
||||||
8. [../progress.md](../progress.md):历史执行进度、验证结果和阻塞点。
|
8. [../progress.md](../progress.md):历史执行进度、验证结果和阻塞点。
|
||||||
|
|
||||||
如果仓库根目录有 `AGENTS.md`、`CLAUDE.md` 或其他 agent 规则文件,也必须先读。仓库级规则优先于项目局部建议。
|
如果仓库根目录有 `AGENTS.md`、`CLAUDE.md` 或其他 agent 规则文件,也必须先读。仓库级规则优先于项目局部建议。
|
||||||
@@ -55,7 +55,7 @@ MVP 只做:
|
|||||||
- 运营勾选任务并按当前排序顺序执行。
|
- 运营勾选任务并按当前排序顺序执行。
|
||||||
- 通过 `uiautomator2 + ADB` 控制一台已登录拼多多账号的 Android 真机。
|
- 通过 `uiautomator2 + ADB` 控制一台已登录拼多多账号的 Android 真机。
|
||||||
- 打开商品链接,跳转拼多多 App,识别页面状态,选择指定 SKU 和数量。
|
- 打开商品链接,跳转拼多多 App,识别页面状态,选择指定 SKU 和数量。
|
||||||
- 默认到支付确认或需要人工输入的位置暂停,支持人工接管后继续。
|
- 默认到支付确认或需要人工输入的位置暂停,支持人工接管后继续。
|
||||||
- 预留受控自动支付能力:仅在开启配置、金额/SKU/数量/地址二次校验通过、未触发安全校验时继续支付。
|
- 预留受控自动支付能力:仅在开启配置、金额/SKU/数量/地址二次校验通过、未触发安全校验时继续支付。
|
||||||
- 成功后展示订单号,并写入 Excel 结果文件。
|
- 成功后展示订单号,并写入 Excel 结果文件。
|
||||||
- 失败时展示失败原因、保留截图和页面 XML 以便排查。
|
- 失败时展示失败原因、保留截图和页面 XML 以便排查。
|
||||||
@@ -110,12 +110,11 @@ MVP 不做:
|
|||||||
|
|
||||||
## 验证命令
|
## 验证命令
|
||||||
|
|
||||||
当前项目尚未初始化代码。初始化后应在这里补充真实命令:
|
项目骨架已初始化(T-001)。当前可运行的真实验证命令(Windows 运营机用 `python`,Linux/WSL 开发用 `python3`):
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
# 计划命令,待项目初始化后确认
|
|
||||||
python -m pytest
|
|
||||||
python -m compileall src
|
python -m compileall src
|
||||||
|
python -m unittest discover -s tests -t .
|
||||||
python src/main.py
|
python src/main.py
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -126,6 +125,6 @@ python src/main.py
|
|||||||
- 改 Android 自动化后跑:真机连接测试和最小链路测试。
|
- 改 Android 自动化后跑:真机连接测试和最小链路测试。
|
||||||
- 如果命令当前不可运行,必须在回复里如实说明原因。
|
- 如果命令当前不可运行,必须在回复里如实说明原因。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
| 鉴权方式 | 无工具账号 | 已定 | 本地内部工具;拼多多账号由真机 App 登录态承担。 |
|
| 鉴权方式 | 无工具账号 | 已定 | 本地内部工具;拼多多账号由真机 App 登录态承担。 |
|
||||||
| 后端服务 | 无独立后端 | 已定 | 单机 GUI 内直接调用本地模块。 |
|
| 后端服务 | 无独立后端 | 已定 | 单机 GUI 内直接调用本地模块。 |
|
||||||
| 日志 | Python `logging` | 已定 | 保存执行日志,便于排查。 |
|
| 日志 | Python `logging` | 已定 | 保存执行日志,便于排查。 |
|
||||||
| 测试 | `pytest` | 待定 | 建议用于 Excel 解析、状态机、SKU 匹配等纯逻辑测试。 |
|
| 测试 | 标准库 `unittest`(当前);`pytest` 后续按需 | 已定(骨架阶段) | 骨架阶段零第三方依赖,用 `unittest`;需参数化/夹具等能力时再按依赖纪律引入 `pytest`。 |
|
||||||
| 打包 | PyInstaller | 待定 | MVP 稳定后打包为 Windows 可执行程序。 |
|
| 打包 | PyInstaller | 待定 | MVP 稳定后打包为 Windows 可执行程序。 |
|
||||||
|
|
||||||
## 二、决策记录与演进
|
## 二、决策记录与演进
|
||||||
@@ -27,10 +27,11 @@
|
|||||||
- 当前选择 **Excel 输入输出**,因为运营后期可直接整理历史文档,MVP 不需要数据库。
|
- 当前选择 **Excel 输入输出**,因为运营后期可直接整理历史文档,MVP 不需要数据库。
|
||||||
- 当前不引入 **Web 后台 / 多设备调度 / 数据库**,避免第一版复杂度过高。
|
- 当前不引入 **Web 后台 / 多设备调度 / 数据库**,避免第一版复杂度过高。
|
||||||
- OCR、图像识别、Appium、SQLite 作为后续选项,仅在真实页面验证需要时引入。
|
- OCR、图像识别、Appium、SQLite 作为后续选项,仅在真实页面验证需要时引入。
|
||||||
|
- T-001 骨架阶段测试先用**标准库 `unittest`**,不引入 `pytest`:骨架只需冒烟测试,且保持零第三方依赖、不依赖网络即可验证;待出现参数化、夹具、丰富断言等需求时再按依赖纪律引入 `pytest`。
|
||||||
|
|
||||||
## 三、构建与运行命令
|
## 三、构建与运行命令
|
||||||
|
|
||||||
当前代码尚未初始化。以下为计划命令,初始化后必须改成真实命令。
|
骨架已初始化(T-001)。以下为真实命令;打包命令待 T-402 落地后确认。
|
||||||
|
|
||||||
| 用途 | 命令 |
|
| 用途 | 命令 |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
@@ -38,9 +39,9 @@
|
|||||||
| 激活虚拟环境 | `.venv\Scripts\Activate.ps1` |
|
| 激活虚拟环境 | `.venv\Scripts\Activate.ps1` |
|
||||||
| 安装依赖 | `pip install -r requirements.txt` |
|
| 安装依赖 | `pip install -r requirements.txt` |
|
||||||
| 本地运行 | `python src/main.py` |
|
| 本地运行 | `python src/main.py` |
|
||||||
| 测试 | `python -m pytest` |
|
| 测试 | `python -m unittest discover -s tests -t .` |
|
||||||
| 语法检查 | `python -m compileall src` |
|
| 语法检查 | `python -m compileall src` |
|
||||||
| 打包 | `pyinstaller app.spec` |
|
| 打包(待 T-402) | `pyinstaller app.spec` |
|
||||||
|
|
||||||
Windows PowerShell:
|
Windows PowerShell:
|
||||||
|
|
||||||
@@ -49,7 +50,7 @@ python -m venv .venv
|
|||||||
.venv\Scripts\Activate.ps1
|
.venv\Scripts\Activate.ps1
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
python src/main.py
|
python src/main.py
|
||||||
python -m pytest
|
python -m unittest discover -s tests -t .
|
||||||
```
|
```
|
||||||
|
|
||||||
## 四、设备与环境要求
|
## 四、设备与环境要求
|
||||||
@@ -59,7 +60,7 @@ python -m pytest
|
|||||||
- ADB 可用,电脑能看到设备。
|
- ADB 可用,电脑能看到设备。
|
||||||
- 真机已安装拼多多 App,并已登录可下单账号。
|
- 真机已安装拼多多 App,并已登录可下单账号。
|
||||||
- 真机网络稳定,屏幕常亮或执行期间不锁屏。
|
- 真机网络稳定,屏幕常亮或执行期间不锁屏。
|
||||||
- 支付默认由运营人工确认;开启受控自动支付时,必须由配置、金额上限和二次校验控制。
|
- 支付默认由运营人工确认;开启受控自动支付时,必须由配置、金额上限和二次校验控制。
|
||||||
- 验证码、风控、人脸、短信等安全校验节点由运营人工处理。
|
- 验证码、风控、人脸、短信等安全校验节点由运营人工处理。
|
||||||
|
|
||||||
## 五、依赖纪律
|
## 五、依赖纪律
|
||||||
@@ -69,4 +70,4 @@ python -m pytest
|
|||||||
- 不允许同一职责并存两套框架或两套状态管理方案。
|
- 不允许同一职责并存两套框架或两套状态管理方案。
|
||||||
- 不允许为了绕过平台安全校验而引入逆向、Hook、抓包改包等依赖。
|
- 不允许为了绕过平台安全校验而引入逆向、Hook、抓包改包等依赖。
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
- 绝不实现无配置、无二次校验、无金额上限的自动支付。
|
- 绝不实现无配置、无二次校验、无金额上限的自动支付。
|
||||||
- 绝不记录支付密码、短信验证码、账号密码等敏感信息。
|
- 绝不记录支付密码、短信验证码、账号密码等敏感信息。
|
||||||
- 绝不调用、逆向或改造拼多多非公开接口。
|
- 绝不调用、逆向或改造拼多多非公开接口。
|
||||||
- 自动支付必须显式开启,并在商品、SKU、数量、地址、金额校验通过后才能继续。
|
- 自动支付必须显式开启,并在商品、SKU、数量、地址、金额校验通过后才能继续。
|
||||||
- 遇到安全校验时进入 `待人工`,由运营在真机上处理。
|
- 遇到安全校验时进入 `待人工`,由运营在真机上处理。
|
||||||
|
|
||||||
## 5. 架构纪律
|
## 5. 架构纪律
|
||||||
@@ -73,11 +73,11 @@
|
|||||||
- [ ] 涉及 Android 自动化时,说明是否已用真机验证。
|
- [ ] 涉及 Android 自动化时,说明是否已用真机验证。
|
||||||
- [ ] 回复里如实说明跑了什么命令、结果如何。
|
- [ ] 回复里如实说明跑了什么命令、结果如何。
|
||||||
|
|
||||||
计划命令,初始化后必须改成真实命令:
|
当前真实验证命令(Windows 用 `python`,Linux/WSL 用 `python3`):
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
python -m pytest
|
|
||||||
python -m compileall src
|
python -m compileall src
|
||||||
|
python -m unittest discover -s tests -t .
|
||||||
python src/main.py
|
python src/main.py
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -93,5 +93,5 @@ python src/main.py
|
|||||||
|
|
||||||
问题要具体,说明你卡在哪里、有哪些选项、倾向哪个选项以及原因。
|
问题要具体,说明你卡在哪里、有哪些选项、倾向哪个选项以及原因。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+12
-11
@@ -7,10 +7,10 @@
|
|||||||
## 当前快照
|
## 当前快照
|
||||||
|
|
||||||
- 日期:2026-06-24
|
- 日期:2026-06-24
|
||||||
- 阶段:MVP 起步 / 原型验证前
|
- 阶段:Phase 0 地基(T-001 完成)/ 原型验证前
|
||||||
- 技术栈:计划使用 Python + PySide6 + `uiautomator2` + ADB + `openpyxl`
|
- 技术栈:Python 3.10(骨架已跑通);计划接入 PySide6 + `uiautomator2` + ADB + `openpyxl`
|
||||||
- 生产代码:尚未初始化
|
- 生产代码:已初始化最小骨架(`src/main.py` 最小入口)
|
||||||
- 测试:尚未初始化
|
- 测试:标准库 `unittest` 冒烟测试(`tests/test_smoke.py`)
|
||||||
- 数据:尚未提供真实 Excel 样例
|
- 数据:尚未提供真实 Excel 样例
|
||||||
|
|
||||||
## 当前目录要点
|
## 当前目录要点
|
||||||
@@ -18,8 +18,9 @@
|
|||||||
| 路径 | 状态 | 说明 |
|
| 路径 | 状态 | 说明 |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `docs/` | 已有 | 项目规范化文档,已按 harness coding 文档风格建立。 |
|
| `docs/` | 已有 | 项目规范化文档,已按 harness coding 文档风格建立。 |
|
||||||
| `src/` | 待建 | 桌面 GUI、任务执行器、Excel、Android 自动化代码。 |
|
| `src/` | 已有 | 已建最小入口 `src/main.py`;GUI/执行器/Excel/Android 模块由后续任务添加。 |
|
||||||
| `tests/` | 待建 | Excel 解析、状态机、SKU 匹配等测试。 |
|
| `tests/` | 已有 | 已建冒烟测试 `tests/test_smoke.py`(unittest)。 |
|
||||||
|
| `requirements.txt` | 已有 | 依赖清单;当前零第三方运行时依赖,含依赖纪律注释。 |
|
||||||
| `samples/` | 待建 | 脱敏 Excel 样例。 |
|
| `samples/` | 待建 | 脱敏 Excel 样例。 |
|
||||||
| `logs/` | 待建 | 本地运行日志。 |
|
| `logs/` | 待建 | 本地运行日志。 |
|
||||||
| `artifacts/` | 待建 | 截图、UI XML、结果文件等运行产物。 |
|
| `artifacts/` | 待建 | 截图、UI XML、结果文件等运行产物。 |
|
||||||
@@ -28,20 +29,20 @@
|
|||||||
|
|
||||||
任务定义以 [`../tasks.md`](../tasks.md) 为准,执行记录以 [`../progress.md`](../progress.md) 为准。
|
任务定义以 [`../tasks.md`](../tasks.md) 为准,执行记录以 [`../progress.md`](../progress.md) 为准。
|
||||||
|
|
||||||
- 已完成:项目文档初始化。
|
- 已完成:项目文档初始化;`T-001 初始化 Python 项目骨架`。
|
||||||
- 正在进行:无。
|
- 正在进行:无。
|
||||||
- 下一个可领取任务:`T-001 初始化 Python 项目骨架`。
|
- 下一个可领取任务:`T-002 建立核心数据模型和状态枚举`。
|
||||||
|
|
||||||
## 当前可运行内容
|
## 当前可运行内容
|
||||||
|
|
||||||
当前没有可运行代码。初始化后应补充真实命令:
|
骨架已可运行(T-001)。真实命令(Windows 用 `python`,Linux/WSL 用 `python3`):
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
# 本地开发
|
# 本地运行入口
|
||||||
python src/main.py
|
python src/main.py
|
||||||
|
|
||||||
# 测试
|
# 测试
|
||||||
python -m pytest
|
python -m unittest discover -s tests -t .
|
||||||
|
|
||||||
# 语法检查
|
# 语法检查
|
||||||
python -m compileall src
|
python -m compileall src
|
||||||
|
|||||||
+14
-3
@@ -14,9 +14,9 @@
|
|||||||
## 当前摘要
|
## 当前摘要
|
||||||
|
|
||||||
- 日期:2026-06-24
|
- 日期:2026-06-24
|
||||||
- 阶段:MVP 起步 / 原型验证前
|
- 阶段:Phase 0 地基(T-001 完成)/ 原型验证前
|
||||||
- 当前任务:尚未开始编码
|
- 当前任务:无(T-001 已完成)
|
||||||
- 下一个任务:`T-001 初始化 Python 项目骨架`
|
- 下一个任务:`T-002 建立核心数据模型和状态枚举`
|
||||||
- 当前阻塞:尚未提供真实 Excel 样例、Android 真机和测试商品链接
|
- 当前阻塞:尚未提供真实 Excel 样例、Android 真机和测试商品链接
|
||||||
|
|
||||||
## 进度记录
|
## 进度记录
|
||||||
@@ -47,6 +47,17 @@
|
|||||||
|
|
||||||
- `02-requirements.md` §七 新增「平台规则与合规风险」一条:中立记录对第三方 App 做批量自动化下单可能触及平台协议/账号风控的已知风险,交叉引用 `01-vision.md` 非目标与 `05-coding-rules.md` 安全纪律;明确 MVP 不提供任何规避平台限制能力,使用范围与账号风险由业务方评估承担。
|
- `02-requirements.md` §七 新增「平台规则与合规风险」一条:中立记录对第三方 App 做批量自动化下单可能触及平台协议/账号风控的已知风险,交叉引用 `01-vision.md` 非目标与 `05-coding-rules.md` 安全纪律;明确 MVP 不提供任何规避平台限制能力,使用范围与账号风险由业务方评估承担。
|
||||||
|
|
||||||
|
### 2026-06-24 · T-001 初始化 Python 项目骨架(DONE)
|
||||||
|
|
||||||
|
- 完成:建立 `src/`(`__init__.py`、`main.py` 最小可运行入口)、`tests/`(`__init__.py`、`test_smoke.py` 冒烟测试)、`requirements.txt`(含依赖纪律注释,当前零第三方运行时依赖)。
|
||||||
|
- 决策:骨架阶段测试用标准库 `unittest`,不引入 `pytest`(sandbox 网络受限装不上,且骨架只需冒烟测试、保持零依赖更契合范围纪律);已在 `03-tech-stack.md` 留痕。
|
||||||
|
- 文档:用真实命令替换 `00`/`03`/`05`/`current-state` 的占位符(`python -m pytest` → `python -m unittest discover -s tests -t .`)。
|
||||||
|
- 验证(WSL Python 3.10.12,命令用 `python3`):
|
||||||
|
- `python3 -m compileall src` → OK
|
||||||
|
- `python3 -m unittest discover -s tests -t .` → Ran 2 tests, OK
|
||||||
|
- `python3 src/main.py` → 正常输出,exit=0
|
||||||
|
- 范围:未提前创建 models/GUI/Android 等后续任务模块;`logs/`、`artifacts/`、`samples/` 归 T-003。
|
||||||
|
|
||||||
## 阻塞与风险
|
## 阻塞与风险
|
||||||
|
|
||||||
- 真实 Excel 表头待提供。
|
- 真实 Excel 表头待提供。
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# 运行时依赖清单
|
||||||
|
#
|
||||||
|
# 依赖纪律:新增前先说明用途、替代方案与维护成本,并同步 docs/03-tech-stack.md。
|
||||||
|
# 依赖随任务按需引入,不为“将来可能用到”提前添加:
|
||||||
|
# - T-101 起:uiautomator2 # Android 真机控制(ADB + uiautomator2)
|
||||||
|
# - T-201 起:openpyxl # 固定表头 Excel 读取与结果回写
|
||||||
|
# - T-202 起:PySide6 # Windows 桌面 GUI
|
||||||
|
# - T-402 起:pyinstaller # 打包 Windows 可执行程序(开发期依赖)
|
||||||
|
#
|
||||||
|
# 当前 T-001 骨架阶段无第三方运行时依赖。
|
||||||
|
# 测试使用 Python 标准库 unittest,无需额外安装;
|
||||||
|
# 后续如需参数化/夹具等能力,再按依赖纪律评估引入 pytest。
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
"""拼多多批量下单执行器源码包。"""
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
"""拼多多批量下单执行器 · 应用入口。
|
||||||
|
|
||||||
|
T-001 骨架阶段的最小可运行入口,仅用于验证项目结构与运行环境。
|
||||||
|
后续任务在此接入:PySide6 主窗口(T-202)、任务执行器(T-204)等。
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
APP_NAME = "拼多多批量下单执行器"
|
||||||
|
APP_VERSION = "0.1.0"
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
"""最小入口:打印应用信息并返回退出码 0。
|
||||||
|
|
||||||
|
GUI 与自动化能力尚未接入,此处只确认骨架可运行。
|
||||||
|
"""
|
||||||
|
print(f"{APP_NAME} v{APP_VERSION}")
|
||||||
|
print("项目骨架已就绪(T-001);GUI 与真机自动化将在后续任务接入。")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
raise SystemExit(main())
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
| ID | 任务 | 依赖 | 验收要点 | 状态 |
|
| ID | 任务 | 依赖 | 验收要点 | 状态 |
|
||||||
| --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- |
|
||||||
| T-001 | 初始化 Python 项目骨架 | - | 建立 `src/`、`tests/`、`requirements.txt`;可运行最小入口;不引入无关依赖;用**真实可运行命令**替换 `00-ai-start-here.md`、`03-tech-stack.md`、`05-coding-rules.md`、`current-state.md` 中的占位符验证命令 | TODO |
|
| T-001 | 初始化 Python 项目骨架 | - | 建立 `src/`、`tests/`、`requirements.txt`;可运行最小入口;不引入无关依赖;用**真实可运行命令**替换 `00-ai-start-here.md`、`03-tech-stack.md`、`05-coding-rules.md`、`current-state.md` 中的占位符验证命令 | DONE |
|
||||||
| T-002 | 建立核心数据模型和状态枚举 | T-001 | `OrderTask`、`TaskStatus` 与 `04-architecture.md` 一致;有基础单元测试 | TODO |
|
| T-002 | 建立核心数据模型和状态枚举 | T-001 | `OrderTask`、`TaskStatus` 与 `04-architecture.md` 一致;有基础单元测试 | TODO |
|
||||||
| T-003 | 建立日志和运行产物目录策略 | T-001 | 日志、截图、UI XML 输出路径清晰;不记录敏感信息 | TODO |
|
| T-003 | 建立日志和运行产物目录策略 | T-001 | 日志、截图、UI XML 输出路径清晰;不记录敏感信息 | TODO |
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
"""测试包。"""
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
"""项目骨架冒烟测试(T-001)。
|
||||||
|
|
||||||
|
确保最小入口可导入、可运行,为后续任务提供可运行的测试基线。
|
||||||
|
"""
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from src.main import APP_NAME, APP_VERSION, main
|
||||||
|
|
||||||
|
|
||||||
|
class SmokeTest(unittest.TestCase):
|
||||||
|
def test_main_returns_zero(self):
|
||||||
|
"""最小入口应正常返回退出码 0。"""
|
||||||
|
self.assertEqual(main(), 0)
|
||||||
|
|
||||||
|
def test_app_metadata_present(self):
|
||||||
|
"""应用名与版本号不应为空。"""
|
||||||
|
self.assertTrue(APP_NAME)
|
||||||
|
self.assertTrue(APP_VERSION)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
Reference in New Issue
Block a user