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 jsonfor recipe graph, parameters, attributes, aliases, and assignmentsjust --show <recipe>for rendered body text checksjust --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
justfixture (JustfileFixture) - a
justfilemarker
CLI options:
--justfile-root: directory containingjustfile/Justfile(auto-discovered by default)--just-bin: path or name of thejustbinary (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)returnssubprocess.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 checkuv run pytest -q --hypothesis-show-statistics
Project details
Release history Release notifications | RSS feed
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6df1d6dda86d282ec1631409468143d80ebbddfd7a4753fb55c7fe9885ad5297
|
|
| MD5 |
2414d9b98f513937ee9d4f153297bb9a
|
|
| BLAKE2b-256 |
2f4dd6558b67ea64095e32e60527da410f1ec42e566dde3804f2345ac15ad419
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0886f22e113f2e950dab6e26a3a78238addbe5b55660a5e07aa296f752da64e9
|
|
| MD5 |
3c5f61825936dff979e417cb11c98947
|
|
| BLAKE2b-256 |
66536c4097e518f097a6db5f67bef7392dd489a64f7c6989b7b7dae0a85b8af0
|