test(workspace): centralize pytest-cov config + 92% floor (closes #1817)
The Python workspace already runs pytest-cov in CI but with no threshold and inline-flagged config. CI run 24956647701 (2026-04-26 staging) reports 97% coverage on the package — well above the issue's 75% target. The actionable gap is locking in a floor so a regression can't sneak past, and centralizing config so local `pytest` matches CI. Changes: - workspace/pytest.ini — coverage flags moved into addopts (-q, --cov=., --cov-report=term-missing, --cov-fail-under=92). 92% = current 97% measurement minus the 5pp safety margin the issue's Step 3 prescribes. - workspace/.coveragerc (new) — [run] omit list and [report] skip_covered. coverage.py doesn't read pytest.ini sections, so the omit config has to live here. - .github/workflows/ci.yml — removed the inline --cov flags from the Python Lint & Test step; now reads from pytest.ini. Workflow stays the same single-command shape, just simpler. Result: any PR that drops coverage below 92% fails CI loudly. Floor ratchets up by replacing 92 with current measurement on a future test-writing pass — same shape as Go coverage gates landed elsewhere. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
dff14c010e
commit
355355a80a
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
@ -283,7 +283,9 @@ jobs:
|
||||
cache: pip
|
||||
cache-dependency-path: workspace/requirements.txt
|
||||
- run: pip install -r requirements.txt pytest pytest-asyncio pytest-cov
|
||||
- run: python -m pytest --tb=short -q --cov=. --cov-report=term-missing
|
||||
# Coverage flags + fail-under floor moved into workspace/pytest.ini
|
||||
# (issue #1817) so local `pytest` and CI use identical config.
|
||||
- run: python -m pytest --tb=short
|
||||
|
||||
# SDK + plugin validation moved to standalone repo:
|
||||
# github.com/Molecule-AI/molecule-sdk-python
|
||||
|
||||
13
workspace/.coveragerc
Normal file
13
workspace/.coveragerc
Normal file
@ -0,0 +1,13 @@
|
||||
# coverage.py config — consumed by `pytest --cov` via the pytest-cov
|
||||
# plugin. Lives here (not in pytest.ini) because coverage.py only reads
|
||||
# .coveragerc / setup.cfg / tox.ini / pyproject.toml — the [coverage:*]
|
||||
# sections in pytest.ini are silently ignored. See issue #1817.
|
||||
[run]
|
||||
omit =
|
||||
*/tests/*
|
||||
*/__init__.py
|
||||
plugins_registry/*
|
||||
|
||||
[report]
|
||||
# Skip files at 100% in the term-missing output to keep CI logs readable.
|
||||
skip_covered = True
|
||||
@ -3,4 +3,17 @@ testpaths = tests
|
||||
python_files = test_*.py
|
||||
python_functions = test_*
|
||||
asyncio_mode = auto
|
||||
addopts = -q
|
||||
# Coverage config moved here from .github/workflows/ci.yml so local
|
||||
# `pytest` matches CI without operator-typed flags. cov-fail-under
|
||||
# pins the floor at 92% — 5pp below the 97% measured on staging
|
||||
# (run 24956647701, 2026-04-26). Floor exists so a regression that
|
||||
# drops coverage doesn't sneak past CI; tightening above 92% should
|
||||
# follow real measurement, not aspiration. See issue #1817.
|
||||
addopts =
|
||||
-q
|
||||
--cov=.
|
||||
--cov-report=term-missing
|
||||
--cov-fail-under=92
|
||||
# Coverage omit / report config lives in workspace/.coveragerc — coverage.py
|
||||
# only reads .coveragerc / setup.cfg / tox.ini / pyproject.toml, NOT
|
||||
# pytest.ini, so [coverage:*] sections here would be silently ignored.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user