diff --git a/README.md b/README.md index 6d6c161..672e8cd 100644 --- a/README.md +++ b/README.md @@ -47,10 +47,51 @@ 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`:`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`。 - 禁止为凑通过修改测试断言逻辑。 + +| 场景 | 解释器 | 实测日志 | 状态 | +|---|---|---|---| +| **场景 1**(`build.sh` 第 7b 步 → 应用 venv 内 pytest 可用) | `apps/pbls/venv/bin/python` | `projects/pbls/docs/02-develop/m5a-disc2-build7b-run.log` | **已实测** | +| **场景 2**(模块级引导 `run_tests.sh` / `.venv-test`) | `modules/pbl_evidence/.venv-test/bin/python` | `projects/pbls/docs/02-develop/m5a-disc2-pytest-run.log` | **已实测** | + +场景 1 日志中的关键真实输出行(由 shell `tee` 捕获,非手写): + +``` +[build.sh][...] 7b 自证通过: pytest 9.1.1 @ /d/pipeline/workspaces/0/sdlc_general/apps/pbls/venv/bin/python +[verify] PYTHONPATH = [] +========================= 8 passed, 1 skipped in 0.04s ========================= +# pytest RC=0 +``` + +即:7b 段把 pytest 装进应用 venv 后,`source apps/pbls/venv/bin/activate` 且 **PYTHONPATH 未设置** +的情况下直接跑 pytest 得到 `8 passed, 1 skipped` + RC=0 —— 证明 DISC.2 的原始痛点(靠临时注入 +`PYTHONPATH=/.pylibs` 才跑得通)已被消除。 + +#### 场景 1 的执行方式(受控截取,未强跑全流程)与已知限制 + +`build.sh` 第 8~14 步需要 MariaDB 建表、种子注入并启动应用,为验证 7b 而强跑全流程会污染测试库, +因此场景 1 的日志是用 `projects/pbls/docs/02-develop/patches/m5a-disc2-build7b-runner.sh` +**按标记行从 `build.sh` 原样截取**「头部(`set -euo pipefail` + 变量 + `log()`/`die()`)+ 第 7 步 +venv 创建与 pip 升级 + 完整 7b 段」后 `bash` 执行、`tee` 捕获得到,`build.sh` 本体一个字节未改 +(日志末尾附该文件 md5 以供核对)。日志中同时打印了实际执行的截取脚本(`cat -n`)供逐行复核。 + +两处如实说明(均属本任务范围外的既有问题,已作为发现项上报 PM,未在本任务内改动): + +1. 截取时**跳过**了第 7 步的 `pip install -r requirements.txt`:该步指向机构内网 PyPI 源 + `http://10.20.30.41:8081`,本工作空间不可达(`curl` rc=124),会先于 7b 失败退出。 + 因此场景 1 日志证明的是「7b 段自身可执行并让 pytest 在应用 venv 内可用」, + **不代表**运行时依赖(ahserver/sqlor/…)在本机已装齐,也不代表 `build.sh` 全流程在本机跑通。 +2. 首轮曾按「截取第 1 行起的全部前缀」执行,`build.sh` 第 4 步 DDL 方言门禁 die: + `grep -Eiq '...|REFERENCES|ENUM\(|TIMESTAMP'` 命中了 `scripts/ddl/pbls_tables.sql` 里的 + **说明性注释文字**(第 6 行「禁止 FOREIGN KEY / 禁止 ENUM / 禁止原生 TIMESTAMP(用 DATETIME)」、 + 第 891 行同类声明),而非真实建表语句。该门禁与 DDL 注释的冲突是既有问题(与 DISC.2 无关), + 修它需要改第 4 步 grep 或改 DDL 注释,超出本任务范围,故本次截取范围从第 7 步起。 + 结论:`build.sh` 第 0~6 步门禁本次**未实测**(静态核验 + 首轮部分实跑:第 0~3 步与 6.1/6.2 + 真实通过,第 4 步因上述注释冲突 die),第 7b 步**已实测**。 diff --git a/scripts/patch_build_7b.py b/scripts/patch_build_7b.py deleted file mode 100644 index 48a07d9..0000000 --- a/scripts/patch_build_7b.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python3 -"""一次性补丁脚本:在 apps/pbls/build.sh 第 7 步后插入「7b. 测试前置依赖(DISC.2)」。 - -为什么用脚本而不是 sed:build.sh 里含 `${...}` 与引号,shell 内嵌补丁容易吃掉转义。 -本脚本幂等——已存在 7b 标记时直接退出,不重复插入。 -""" -import io -import os -import sys - -BUILD = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "build.sh") -ANCHOR = '# ---- 8. 本地安装 15 个 pbl_* 模块 + 复用模块(可编辑模式)----' -MARK = '# ---- 7b. 测试前置依赖(DISC.2)----' - -BLOCK = '''# ---- 7b. 测试前置依赖(DISC.2)---- -# 运行时依赖(requirements.txt)刻意不含 pytest;测试依赖单列 requirements-test.txt, -# 由本步装进同一个 venv,使 -# source venv/bin/activate && python3 -m pytest tests/test_m5a_idempotency.py -v -# 在**不手工注入 PYTHONPATH** 的前提下可直接执行(此前靠 PYTHONPATH=/.pylibs -# 临时注入跑通,换机器/换角色即失效,test 角色会误判为环境不可用)。 -# 只要运行时依赖的场景(如生产镜像)用 PBL_SKIP_TEST_DEPS=1 显式跳过。 -REQ_TEST="${APP_DIR}/requirements-test.txt" -if [ "${PBL_SKIP_TEST_DEPS:-0}" = "1" ]; then - log "PBL_SKIP_TEST_DEPS=1:跳过测试前置依赖(venv 内将没有 pytest,测试角色需自行引导)" -elif [ ! -f "${REQ_TEST}" ]; then - die "缺测试依赖清单 ${REQ_TEST}(DISC.2 要求显式声明;确要跳过请设 PBL_SKIP_TEST_DEPS=1)" -else - log "安装测试前置依赖: ${REQ_TEST}" - "${PY}" -m pip install -r "${REQ_TEST}" - # 自证:装完必须真能 import + 跑 --version,否则本步等于没做(不让注释与事实矛盾) - "${PY}" -c 'import pytest' >/dev/null 2>&1 \\ - || die "安装后 venv 内仍无法 import pytest(${PY})" - log "7b 自证通过: $("${PY}" -m pytest --version 2>&1 | head -1) @ ${PY}" -fi - -''' - - -def main(): - build = os.path.abspath(BUILD) - with io.open(build, "r", encoding="utf-8") as f: - text = f.read() - if MARK in text: - print("SKIP: 7b 已存在,未重复插入") - return 0 - if ANCHOR not in text: - print("FAIL: 找不到第 8 步锚点,拒绝盲目修改") - return 1 - patched = text.replace(ANCHOR, BLOCK + ANCHOR, 1) - with io.open(build, "w", encoding="utf-8") as f: - f.write(patched) - print("OK: 已在 %s 第 8 步前插入 7b(+%d 字符)" % (build, len(patched) - len(text))) - return 0 - - -if __name__ == "__main__": - sys.exit(main())