Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Provides standardized pytest config, reusable fixtures, and CI integration patterns. Use when setting up or auditing a Python plugin's test infrastructure.
.claude/skills/athola-pytest-config/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 7% | 0% |
| case-13 | ✗→✓ | ▲ Improved | -6% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 13% | 0% |
Standardized pytest configuration and patterns for consistent testing infrastructure across Claude Night Market plugins.
toml[tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = [ "-v", "--cov=src", "--cov-report=term-missing", "--cov-fail-under=80", "--strict-markers", ] markers = [ "unit: marks tests as unit tests", "integration: marks tests as integration tests", "slow: marks tests as slow running", ] [tool.coverage.run] source = ["src"] omit = ["*/tests/*", "*/migrations/*", "*/__pycache__/*"] branch = true [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "def __str__", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "class .*\\bProtocol\\):", "@(abc\\.)?abstractmethod", ] precision = 2 show_missing = true
Verification: Run pytest --collect-only to verify discovery, pytest -v --co -q for markers, and pytest --cov for coverage thresholds.
For detailed implementation patterns, see:
modules/README.md for module organization overviewThis skill provides foundational patterns referenced by:
parseltongue:python-testing - Uses pytest configuration and fixturespensive:test-review - Uses test quality standardssanctum:test-* - Uses conftest patterns and Git fixturesReference in your skill's frontmatter:
yamldependencies: [leyline:pytest-config, leyline:testing-quality-standards]
Tests not discovered Ensure test files match pattern test_*.py or *_test.py. Run pytest --collect-only to verify.
Import errors Check that the module being tested is in PYTHONPATH or install with pip install -e .
Async tests failing Install pytest-asyncio and decorate test functions with @pytest.mark.asyncio
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 11,659 | 7,967 | -32% | 1 | 1 | 0% | 2,133 | 2,386 | +12% | 0 | 0 | — |
case-02 | pass→pass | 9,994 | 7,481 | -25% | 1 | 1 | 0% | 1,815 | 2,244 | +24% | 0 | 0 | — |
case-03 | pass→pass | 13,271 | 11,138 | -16% | 1 | 1 | 0% | 2,355 | 3,155 | +34% | 0 | 0 | — |
case-04 | pass→pass | 7,406 | 5,826 | -21% | 1 | 1 | 0% | 1,251 | 1,863 | +49% | 0 | 0 | — |
case-05 | fail→pass | 9,228 | 9,391 | +2% | 1 | 1 | 0% | 1,904 | 2,680 | +41% | 0 | 0 | — |
case-06 | pass→pass | 10,267 | 6,523 | -36% | 1 | 1 | 0% | 1,823 | 1,844 | +1% | 0 | 0 | — |
case-07 | pass→pass | 5,636 | 3,067 | -46% | 1 | 1 | 0% | 960 | 1,418 | +48% | 0 | 0 | — |
case-08 | pass→pass | 3,002 | 2,743 | -9% | 1 | 1 | 0% | 487 | 1,292 | +165% | 0 | 0 | — |
case-09 | pass→pass | 8,146 | 3,555 | -56% | 1 | 1 | 0% | 1,346 | 1,416 | +5% | 0 | 0 | — |
case-10 | fail→pass | 8,383 | 4,607 | -45% | 1 | 1 | 0% | 1,524 | 1,632 | +7% | 0 | 0 | — |
case-11 | pass→pass | 5,088 | 4,468 | -12% | 1 | 1 | 0% | 749 | 1,484 | +98% | 0 | 0 | — |
case-12 | pass→pass | 8,404 | 3,289 | -61% | 1 | 1 | 0% | 1,417 | 1,383 | -2% | 0 | 0 | — |
case-13 | fail→pass | 9,599 | 3,413 | -64% | 1 | 1 | 0% | 1,510 | 1,417 | -6% | 0 | 0 | — |
case-14 | pass→pass | 10,848 | 2,824 | -74% | 1 | 1 | 0% | 1,794 | 1,366 | -24% | 0 | 0 | — |
case-15 | pass→pass | 7,134 | 3,370 | -53% | 1 | 1 | 0% | 1,274 | 1,411 | +11% | 0 | 0 | — |
case-16 | pass→pass | 10,665 | 4,650 | -56% | 1 | 1 | 0% | 1,834 | 1,643 | -10% | 0 | 0 | — |
case-17 | fail→pass | 8,815 | 4,158 | -53% | 1 | 1 | 0% | 1,375 | 1,555 | +13% | 0 | 0 | — |
case-18 | pass→pass | 5,502 | 2,327 | -58% | 1 | 1 | 0% | 877 | 1,202 | +37% | 0 | 0 | — |
case-19 | pass→pass | 3,849 | 1,580 | -59% | 1 | 1 | 0% | 558 | 1,067 | +91% | 0 | 0 | — |
case-20 | fail→fail | 8,342 | 4,923 | -41% | 1 | 1 | 0% | 1,286 | 1,598 | +24% | 0 | 0 | — |
case-21 | pass→pass | 7,036 | 1,571 | -78% | 1 | 1 | 0% | 1,125 | 1,076 | -4% | 0 | 0 | — |
case-22 | pass→pass | 6,041 | 2,734 | -55% | 1 | 1 | 0% | 964 | 1,145 | +19% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +23 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.