#!/usr/bin/env bash # ===================================================================== # pbl_evidence 测试环境引导(发现项 DISC.2) # # 背景:测试机宿主 python3 **没有** pytest,`python3 -m pytest` 直接 # `No module named pytest`。此前靠临时注入 # PYTHONPATH=/.pylibs(pytest 9.1.1)跑通,属一次性手段, # 不可复现、且会让 test 角色误判为「用例失败/环境不可用」。 # # 本脚本把「测试前置依赖」变成显式、可重放的步骤: # 1) 在模块仓库内建独立测试 venv(默认 .venv-test,已在 .gitignore 排除) # 2) 安装 requirements-dev.txt(== pyproject [project.optional-dependencies].test) # 3) 打印 pytest 版本自证可用 # # 用法: # bash scripts/setup_test_env.sh # PBL_EVIDENCE_TEST_VENV=/tmp/ev-venv bash scripts/setup_test_env.sh # 换 venv 位置 # PBL_EVIDENCE_INSTALL_PKG=1 bash scripts/setup_test_env.sh # 顺带 pip install -e . # # 幂等:venv 已存在则复用,pip 已满足则秒退;可被 build.sh / CI 反复调用。 # ===================================================================== set -euo pipefail MODULE_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" VENV="${PBL_EVIDENCE_TEST_VENV:-${MODULE_ROOT}/.venv-test}" REQ_DEV="${MODULE_ROOT}/requirements-dev.txt" HOST_PY="${PBL_EVIDENCE_HOST_PYTHON:-$(command -v python3)}" log() { echo "[setup_test_env] $*"; } die() { echo "[setup_test_env][FATAL] $*" >&2; exit 1; } [ -f "${REQ_DEV}" ] || die "缺少测试依赖清单 ${REQ_DEV}" [ -x "${HOST_PY}" ] || die "找不到宿主 python3(可用 PBL_EVIDENCE_HOST_PYTHON 指定)" if [ ! -x "${VENV}/bin/python" ]; then log "创建测试 venv: ${VENV}" "${HOST_PY}" -m venv "${VENV}" || die "python3 -m venv 失败(宿主缺 venv 模块?)" else log "复用已存在的测试 venv: ${VENV}" fi VPY="${VENV}/bin/python" # 升级 pip 属尽力而为(离线/内网源可能不可达),失败不阻断——真正的门禁是下一步安装 "${VPY}" -m pip install --quiet --upgrade pip >/dev/null 2>&1 || log "pip 自升级跳过(不影响后续安装)" log "安装测试依赖: ${REQ_DEV}" "${VPY}" -m pip install -r "${REQ_DEV}" || die "安装 pytest 失败:检查内网 PyPI 源可达性(见 README「Running tests」排障)" if [ "${PBL_EVIDENCE_INSTALL_PKG:-0}" = "1" ]; then log "安装模块本体(可编辑):pip install -e ${MODULE_ROOT}" "${VPY}" -m pip install -e "${MODULE_ROOT}" || die "pip install -e . 失败" fi log "自证可用:$("${VPY}" -m pytest --version 2>&1 | head -1)" log "TEST ENV READY: ${VPY}"