testless
AI Cost Tracking
This project uses AI-generated code. Total cost: $1.5000 with 10 AI commits.
Generated on 2026-06-29 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.
Features
| 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?" |
Quick Start
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?"
Configuration
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
Planfile format
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
Architecture
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
License
Licensed under Apache-2.0.
Metadata
Release files for testless 0.1.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| testless-0.1.8.tar.gz | 31.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| testless-0.1.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 64.1 kB
Release files / testless-0.1.8.tar.gz
| Download URL | testless-0.1.8.tar.gz |
|---|---|
| Size | 31.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5f6fcaabd0520bf3c2dc38c7a086d119373a4a679577341f25d348817555ef49
|
|
BLAKE2b-256 checksum How to use checksums |
09f7d2fab11a5719cc7f71c353e36b3cfbe3c6b28ec5d6f0206295f9b06e8e30
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|
Release files / testless-0.1.8-py3-none-any.whl
| Download URL | testless-0.1.8-py3-none-any.whl |
|---|---|
| Size | 33.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cc5b894164cb42d3a41f559cc6a6f3a91db2aaf5d752d686e64cfa62a7c1a996
|
|
BLAKE2b-256 checksum How to use checksums |
9ca30a77a0dfcccd0ded0efef23e77520545f3fbcc9ef594a524aae15803b0ae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|