Skip to main content

pytest-crap

Test PyPI - Version

A pytest plugin that calculates CRAP scores and displays prioritized lists of high-risk functions to guide test writing.

What is CRAP?

CRAP stands for Change Risk Anti-Patterns (or, more colloquially, "Change Risk Analysis and Predictions"). The metric was introduced by Alberto Savoia and Bob Evans to help developers identify code that is both complex and poorly tested—a risky combination.

The CRAP score combines two factors:

  • Cyclomatic Complexity (CC): A measure of how many independent paths exist through your code. More branches (if, for, while, try, etc.) means higher complexity.
  • Code Coverage: The percentage of lines executed by your tests.

The formula is:

CRAP(m) = CC(m)² × (1 - cov(m))³ + CC(m)

Where CC(m) is the cyclomatic complexity and cov(m) is the code coverage (0.0 to 1.0) for method m.

Why Use CRAP Scores?

  • Prioritize testing efforts: Focus on functions that are both complex AND under-tested
  • Identify risky code: High CRAP scores indicate code that's likely to harbor bugs and is difficult to change safely
  • Track improvement: Monitor CRAP scores over time to ensure code quality improves

Interpreting CRAP Scores

Score Interpretation
< 5 Excellent — low complexity, well tested
5–15 Acceptable — reasonable balance
15–30 Warning — consider adding tests or simplifying
> 30 Critical — high risk, prioritize for refactoring/testing

A function with CC=1 and 100% coverage has a CRAP score of 1 (perfect). A function with CC=10 and 0% coverage has a CRAP score of 110 (very high risk).

Installation

pip install pytest-crap

Or with Poetry:

poetry add pytest-crap

Requirements

  • Python 3.10+
  • pytest 7.0+
  • pytest-cov (for coverage data)

Usage

Run pytest with the --crap flag:

pytest --crap

This will run your tests with coverage enabled and display CRAP score tables at the end.

Example Output

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                            CRAP by Function                              ┃
┡━━━━━━━━┯━━━━━┯━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┩
│   CRAP │  CC │ Coverage │ Function             │ File                    │
├────────┼─────┼──────────┼──────────────────────┼─────────────────────────┤
│  42.50 │   8 │    12.5% │ complex_parser       │ src/parser.py           │
│  31.00 │   5 │     0.0% │ validate_input       │ src/validator.py        │
│  12.25 │   3 │    50.0% │ process_data         │ src/processor.py        │
│   1.00 │   1 │   100.0% │ simple_helper        │ src/utils.py            │
└────────┴─────┴──────────┴──────────────────────┴─────────────────────────┘

Options

Option Default Description
--crap false Enable CRAP score reporting
--crap-threshold 30 CRAP score threshold for highlighting. Functions at or above this value are flagged as high-risk.
--crap-top-n 20 Number of functions to display in each table. Set to 0 to show all.

Examples

Show top 10 functions with a stricter threshold:

pytest --crap --crap-threshold=15 --crap-top-n=10

Show all functions regardless of score:

pytest --crap --crap-top-n=0

Combine with other pytest options:

pytest --crap --cov-branch -v tests/

Output Tables

pytest-crap displays three summary tables:

  1. CRAP by Function: Individual functions ranked by CRAP score
  2. CRAP by File: Files ranked by their highest CRAP score, with count of functions above threshold
  3. CRAP by Folder: Directories ranked by highest CRAP score

Integration with CI

Add to your CI pipeline to track CRAP scores. Example GitHub Actions step:

- name: Run tests with CRAP reporting
  run: pytest --crap --crap-threshold=30

Contributing

See contributing.md for development setup and guidelines.

License

MIT

References

Metadata

Release files for pytest-crap 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pytest-crap 0.3.0
File Size Uploaded
pytest_crap-0.3.0.tar.gz 20.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pytest-crap 0.3.0
File Interpreter ABI Platform
pytest_crap-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 30.4 kB

Release files / pytest_crap-0.3.0.tar.gz

Download URL pytest_crap-0.3.0.tar.gz
Size 20.8 kB
Tags Source
SHA-256 checksum
How to use checksums
8267dbf4e83f8ad1430aac86aa1592f99d658dc1a9882dcfc2ee5775dbb5d0cc
BLAKE2b-256 checksum
How to use checksums
23a7fde44fbcbf621b1be3c58081a4ce52abd06f9fef4608f21284fe9ef4a3ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 2, 2025.

Transparency log

Release files / pytest_crap-0.3.0-py3-none-any.whl

Download URL pytest_crap-0.3.0-py3-none-any.whl
Size 9.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
baf7c3e60f8b8f0edbb50190a32f7e43ae4270e6fa48eb15ffd0a3c72ea45445
BLAKE2b-256 checksum
How to use checksums
69eaf05a7cb2a0109453916ffea829e1ed390779edeff01ed96a8eac0a3af257
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 2, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page