Skip to main content

CLI tool to assert that each pytest test function contains exactly one assert statement

Project description

assert-one-assert-per-pytest

Assert that each pytest test function contains exactly one assert.

Why One Assert Per Test?

The "one assert per test" pattern encourages writing focused, atomic tests that verify a single behavior. Benefits include:

  • Clear failure messages: When a test fails, you know exactly what behavior broke
  • Better test names: Tests naturally describe specific behaviors
  • Easier maintenance: Changes to one behavior don't affect unrelated assertions
  • Faster debugging: No need to hunt through multiple assertions

Installation

pip install assert-one-assert-per-pytest

Usage

Command Line

# Scan specific files
assert-one-assert-per-pytest test_example.py

# Scan directories recursively
assert-one-assert-per-pytest tests/

# Use glob patterns
assert-one-assert-per-pytest "tests/**/test_*.py"

# Exclude patterns
assert-one-assert-per-pytest tests/ --exclude "**/conftest.py"

# Verbose output
assert-one-assert-per-pytest tests/ --verbose

# Fail fast (exit on first finding)
assert-one-assert-per-pytest tests/ --fail-fast

# Warn only (always exit 0)
assert-one-assert-per-pytest tests/ --warn-only

GitHub Actions

- uses: 10U-Labs-LLC/assert-one-assert-per-pytest@v1
  with:
    files: "tests/"
    exclude: "**/conftest.py"
    verbose: "true"

As a Python Module

python -m assert_one_assert_per_pytest tests/

Output Format

Default output shows one finding per line:

path/to/test_file.py:10:test_example:0
path/to/test_file.py:25:test_another:3

Format: file_path:line_number:function_name:assert_count

Exit Codes

  • 0: No findings (or --warn-only specified)
  • 1: Findings detected
  • 2: Error (missing files, syntax errors, etc.)

What Counts as an Assert?

This tool counts Python assert statements at the immediate level of test functions. It does not count:

  • Assertions in nested functions or classes
  • pytest.raises or pytest.warns context managers
  • Helper assertions in fixtures or utility functions

Options

Option Description
--exclude PATTERNS Glob patterns to exclude (comma-separated)
--quiet Suppress all output (exit code only)
--verbose Show detailed processing information
--fail-fast Exit after first finding
--warn-only Always exit 0, even with findings

License

Apache 2.0 - See LICENSE.txt

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file assert_one_assert_per_pytest-20260104005852.tar.gz.

File metadata

File hashes

Hashes for assert_one_assert_per_pytest-20260104005852.tar.gz
Algorithm Hash digest
SHA256 5bb981d2d6cc92ef891ebc4f8e2797a637e400cda4cc136df79eb294ea1a52c8
MD5 9da58b189467c8adfde2e10f6504bc67
BLAKE2b-256 f1ac8af62cede561b5e1530e3eb8d335f54a558fcabd4ee6fd9851dcc3a7c9fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for assert_one_assert_per_pytest-20260104005852.tar.gz:

Publisher: release.yml on 10U-Labs-LLC/assert-one-assert-per-pytest

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file assert_one_assert_per_pytest-20260104005852-py3-none-any.whl.

File metadata

File hashes

Hashes for assert_one_assert_per_pytest-20260104005852-py3-none-any.whl
Algorithm Hash digest
SHA256 12726fbc63910d624e52dee81ac551b674f88e1586b3349b7493ca6eab46a050
MD5 4cc2215bdd57f315ce5c1b21775336a6
BLAKE2b-256 d5edce9305769ae58abbd12ec93b5670459cf1562c41e071cc4b0d102911e890

See more details on using hashes here.

Provenance

The following attestation bundles were made for assert_one_assert_per_pytest-20260104005852-py3-none-any.whl:

Publisher: release.yml on 10U-Labs-LLC/assert-one-assert-per-pytest

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page