pbls/README.md
2026-09-22 22:03:22 +08:00

57 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# pbls
PBL Agent OS 验证原型应用(唯一入口 `app/pbls.py`,端口以
`projects/pbls/env/test.json` 为唯一事实源)。业务模块见机构 `modules/pbl_*`。
## 测试依赖(DISC.2)
**结论:pytest 已显式声明,不再依赖临时注入 `PYTHONPATH`。** 宿主 `python3` 上没有 pytest
(`python3 -m pytest` → `No module named pytest`),且本机宿主 user site 是只读文件系统
(`pip install --user` 报 `[Errno 30] Read-only file system`),所以测试依赖的落点是 **venv**。
### 新增/相关文件清单
| 路径 | 层级 | 职责 |
|---|---|---|
| `apps/pbls/requirements-test.txt` | 应用级 | 测试前置依赖清单(`pytest>=7.0,<10`),由 `build.sh` **第 7b 步**装进应用 venv |
| `apps/pbls/build.sh` 第 7b 步 | 应用级 | `pip install -r requirements-test.txt` + `import pytest` 自证;`PBL_SKIP_TEST_DEPS=1` 可跳过 |
| `modules/pbl_evidence/requirements-dev.txt` | 模块级 | 同一版本区间的模块侧清单(不装本包也能跑离线单测的最短路径) |
| `modules/pbl_evidence/scripts/setup_test_env.sh` | 模块级 | 建 `.venv-test` 并安装 `requirements-dev.txt`(含仓库卫生门禁) |
| `modules/pbl_evidence/scripts/activate_test_env.sh` | 模块级 | 打印激活/直接调用测试 venv 解释器的方式 |
| `modules/pbl_evidence/scripts/run_tests.sh` | 模块级 | 一条命令跑测试:无 pytest 时自动引导,再执行 pytest |
| `modules/pbl_evidence/README.md` §Running tests | 文档 | 排障入口 + `PBL_EVIDENCE_TEST_DB` 开关用法 |
### 为什么是两份清单(应用级 vs 模块级)
- `requirements-test.txt`(应用级)服务**整应用**的测试环境:跑 `build.sh` 后 venv 内即有 pytest,
任何 `modules/pbl_*/tests/` 都能用同一个解释器执行。
- `requirements-dev.txt`(模块级)服务**只测本模块**的 CI/离线场景:不安装 pbls 应用、不装本包
(`pip install -e .`)也能一条命令装好依赖。
- 两份**版本区间同源**(`>=7.0,<10`),避免"应用装了 9.x、模块 CI 装了 7.x"导致用例语义漂移。
- 两者都刻意与运行时清单 `requirements.txt` 分离:pytest 不进生产镜像,也不进
`build.sh` 第 5 步的运行时依赖核验(该步只核验 ahserver/sqlor/apppublic/appbase/rbac/PyMySQL)。
### 推荐调用顺序
```bash
# 场景 1:完整应用环境(部署/联调机)
bash apps/pbls/build.sh # 第 7 步 venv → 7b 测试依赖 → 8 装模块
source apps/pbls/venv/bin/activate
python3 -m pytest modules/pbl_evidence/tests/test_m5a_idempotency.py -v
# 场景 2:只跑 pbl_evidence 单测(测试机/CI,最短路径)
bash modules/pbl_evidence/scripts/run_tests.sh # 无 pytest 时自动引导 .venv-test
# 场景 3:只要环境不要跑(手工用 venv 解释器)
bash modules/pbl_evidence/scripts/setup_test_env.sh
bash modules/pbl_evidence/scripts/activate_test_env.sh
```
### 期望结果
- 不带 `PBL_EVIDENCE_TEST_DB`:`8 passed, 1 skipped`,RC=0(`test_double_collect_is_idempotent_with_db`
需真实 MariaDB,未设开关时按设计 SKIPPED,属预期)。
- 带 `PBL_EVIDENCE_TEST_DB`(用法见 `modules/pbl_evidence/README.md` §Running tests):`9 passed`。
- 实测日志:`projects/pbls/docs/02-develop/m5a-disc2-pytest-run.log`。
- 禁止为凑通过修改测试断言逻辑。