Skip to main content

A pytest plugin for testing justfile recipes

Project description

pytest-just

A pytest plugin for testing justfiles.

What is pytest-just?

pytest-just is a plugin that adds a session-scoped just fixture to pytest so you can test justfile contracts directly in your test suite.

It is designed for assertions about recipe structure and intent, including:

  • recipe existence
  • dependency relationships
  • parameter contracts
  • rendered body content
  • alias and assignment mapping

Why use pytest-just?

As projects grow, justfile automation often becomes critical but under-tested. Small recipe changes can quietly break CI, local developer workflows, or release steps.

pytest-just helps by making contract checks:

  • fast
  • repeatable
  • easy to run in CI
  • explicit in code review

This catches automation drift early without requiring full end-to-end execution of every command.

Tooling

  • Package and commands: uv
  • Lint/format checks: ruff
  • Type checks: ty
  • Logging: loguru

Quick start

uv sync
uv run pytest

How does pytest-just work?

pytest-just primarily validates recipe contracts instead of running full recipe side effects. It asks just for structured metadata and rendered recipe text:

  • just --dump --dump-format json for recipe graph, parameters, attributes, aliases, and assignments
  • just --show <recipe> for rendered body text checks
  • just --dry-run <recipe> for safe command smoke checks This keeps tests fast and mostly side-effect free while still validating real justfile behaviour.

Plugin behaviour

The plugin registers:

  • a session-scoped just fixture (JustfileFixture)
  • a justfile marker

CLI options:

  • --justfile-root: directory containing justfile/Justfile (auto-discovered by default)
  • --just-bin: path or name of the just binary (default: just)

Auto-discovery walks upwards from pytest root until it finds justfile or Justfile.

API summary (JustfileFixture)

Primary accessors:

  • recipe_names(include_private=False)
  • dependencies(recipe)
  • parameters(recipe) / parameter_names(recipe)
  • is_shebang(recipe) / is_private(recipe)
  • doc(recipe) / body(recipe) / show(recipe)
  • assignments() / aliases()

Assertions:

  • assert_exists(recipe)
  • assert_depends_on(recipe, expected, transitive=False)
  • assert_parameter(recipe, parameter)
  • assert_body_contains(recipe, text)
  • assert_not_shebang(recipe)
  • assert_variable_referenced(recipe, variable)

Execution support:

  • dry_run(recipe, *args, env=None) returns subprocess.CompletedProcess[str]

Example usage

import pytest

@pytest.mark.justfile
def test_ci_depends_on_test(just):
    just.assert_exists("ci")
    just.assert_depends_on("ci", ["test"], transitive=True)

Example justfiles for development

Sample real-world-inspired justfiles live under examples/public/ and include:

  • dependency chains
  • private recipes
  • parameterised recipes
  • shebang recipes
  • imported justfiles

Use them to exercise fixture behaviour while developing the plugin.

Development workflow

uv sync --extra dev
uv run ruff check .
uv run ty check
uv run pytest -q

Property-based testing (Hypothesis)

The test suite includes property-based tests using hypothesis to stress stable invariants such as:

  • justfile root discovery across varying directory depth
  • body normalisation idempotence
  • recipe signature order invariance
  • alias and assignment mapping round-trip behaviour

Run only property tests:

uv run pytest -q tests/test_hypothesis_properties.py

Show Hypothesis run statistics:

uv run pytest -q --hypothesis-show-statistics

CI

GitHub Actions runs on pull requests and pushes to main, executing:

  • uv run ruff check .
  • uv run ty check
  • uv run pytest -q --hypothesis-show-statistics

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

pytest_just-0.1.2.tar.gz (120.7 kB view details)

Uploaded Source

Built Distribution

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

pytest_just-0.1.2-py3-none-any.whl (8.6 kB view details)

Uploaded Python 3

File details

Details for the file pytest_just-0.1.2.tar.gz.

File metadata

  • Download URL: pytest_just-0.1.2.tar.gz
  • Upload date:
  • Size: 120.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for pytest_just-0.1.2.tar.gz
Algorithm Hash digest
SHA256 6df1d6dda86d282ec1631409468143d80ebbddfd7a4753fb55c7fe9885ad5297
MD5 2414d9b98f513937ee9d4f153297bb9a
BLAKE2b-256 2f4dd6558b67ea64095e32e60527da410f1ec42e566dde3804f2345ac15ad419

See more details on using hashes here.

File details

Details for the file pytest_just-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: pytest_just-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 8.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for pytest_just-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 0886f22e113f2e950dab6e26a3a78238addbe5b55660a5e07aa296f752da64e9
MD5 3c5f61825936dff979e417cb11c98947
BLAKE2b-256 66536c4097e518f097a6db5f67bef7392dd489a64f7c6989b7b7dae0a85b8af0

See more details on using hashes here.

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