name: Unit Tests on: # 指向 v3 的 PR 与推送都跑全量单测,作为合并门禁 pull_request: branches: - v3 push: branches: - v3 # 允许手动触发 workflow_dispatch: permissions: contents: read concurrency: group: unit-tests-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: pytest: runs-on: ubuntu-latest name: Unit Tests timeout-minutes: 20 steps: - name: Checkout code uses: actions/checkout@v5 - name: Set up uv uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 with: version: '0.12.5' python-version: '3.12' enable-cache: true cache-dependency-glob: | pyproject.toml uv.lock - name: Install dependencies run: uv sync --locked - name: Run tests timeout-minutes: 10 run: | # tests/run.py 以 pytest 跑 tests 全量;tests/conftest.py 在收集前把 CONFIG_DIR # 指向临时库并建表;CI 额外生成覆盖率报告,便于后续补测和回归分析。 uv run --locked --no-sync python -m coverage erase uv run --locked --no-sync python -m coverage run tests/run.py uv run --locked --no-sync python -m coverage report uv run --locked --no-sync python -m coverage json uv run --locked --no-sync python -m coverage xml - name: Upload coverage report if: always() uses: actions/upload-artifact@v6 with: name: coverage-report path: | coverage.xml coverage.json retention-days: 7