- š¤ LLM usage: $0.6101 (11 commits)
- š¤ Human dev: ~$700 (7.0h @ $100/h, 30min dedup)
Generated on 2026-07-06 using openrouter/qwen/qwen3-coder-next
testless is a Python package that sits as an analytical layer on top of your existing test suite. It analyses test value, coverage overlap, duplication, and missing gaps, then generates LLM-ready planfile tickets that describe exactly what to remove, refactor, or add.
| Command | What it does |
|---|---|
testless scan |
Run pytest with --cov-context=test and collect metadata |
testless duplicates |
Detect duplicate tests (coverage + AST + fixture overlap) |
testless missing |
Suggest smoke, e2e, contract, and TestQL tests |
testless planfiles |
Generate YAML planfile tickets for an LLM |
testless doctor |
Answer questions: "what to remove?", "what to add?" |
pip install testless # or with uv: uv add --dev testless # 1. Scan your project testless scan # 2. Find duplicate tests (threshold: 85 % similarity) testless duplicates --min-overlap 0.85 # 3. Find missing smoke / service / e2e tests testless missing --services src/myapp # 4. Generate LLM planfiles testless planfiles --out .planfiles/ --with-prompts # 5. Ask doctor questions testless doctor "which tests should I remove?"
Create a .testless.yml in your project root:
packages: - myapp test_dirs: - tests min_duplicate_score: 0.85 planfiles_dir: .planfiles coverage_dir: .coverage_data pytest_args: - --tb=short
Each generated ticket is a self-contained YAML file that an LLM can act on:
version: "1" kind: duplicate id: "DUP-3A7F2C" title: "Remove duplicate test: test_health_ok vs test_health_status_200" goal: "Reduce test suite redundancy without losing unique coverage" context: test_a: tests/api/test_health.py::test_health_ok test_b: tests/api/test_health.py::test_health_status_200 evidence: - description: "score=0.93, coverage_overlap=0.95" score: 0.93 impact: risk: low expected_gains: - shorter test run time - reduced maintenance burden tasks: - description: Compare test_health_ok and test_health_status_200 manually - description: Remove the weaker/less descriptive test - description: Run suite and verify no coverage regression acceptance_criteria: - No decrease in unique line coverage - All remaining tests pass llm_hints: style: minimal change safe_refactor: true
src/testless/
āāā cli.py # Click CLI
āāā config.py # .testless.yml loader
āāā models/
ā āāā planfile.py # Pydantic Planfile model
ā āāā findings.py # Finding models
ā āāā coverage_map.py # CoverageMap model
āāā collect/
ā āāā pytest_runner.py # Run pytest, collect metadata
ā āāā coverage_loader.py # Parse coverage.json contexts
ā āāā fixture_index.py # AST-based fixture indexer
ā āāā endpoint_inventory.py # HTTP endpoint/service scanner
āāā analyze/
ā āāā duplicate_tests.py # Duplicate detection
ā āāā dead_tests.py # Dead test detection
ā āāā missing_tests.py # Missing test suggestions
ā āāā service_risk.py # Service risk scoring
ā āāā refactor_candidates.py # Refactor detection
āāā suggest/
ā āāā smoke.py # Smoke test templates
ā āāā e2e.py # E2E test templates
ā āāā service_tests.py # Service contract templates
ā āāā testql.py # TestQL stub generator
āāā tickets/
ā āāā builder.py # Build Planfile from findings
ā āāā serializer.py # Write planfiles to disk
ā āāā prompts.py # Attach LLM prompts
āāā reporters/
āāā console.py # Coloured terminal output
āāā markdown.py # Markdown report
āāā json.py # JSON report
Licensed under Apache-2.0.