pytest-just
A pytest plugin for testing justfiles.
Package status
pytest-just is published on PyPI.
- PyPI: https://pypi.org/project/pytest-just/
- Source: https://github.com/DataBooth/pytest-just
- Latest release notes:
RELEASE_NOTES.md
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.
In plain terms: just keeps repeatable team tasks in one place, and pytest-just makes sure those tasks keep working as the project changes.
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 - Documentation:
great-docs(Python 3.11+ for docs tooling)
Install from PyPI
Add pytest-just to your test dependencies:
uv add --dev pytest-just
You also need the just binary available in your environment:
just --version
Quick start (package usage)
Create tests that use the plugin fixture:
import pytest
@pytest.mark.justfile
def test_ci_depends_on_test(just):
just.assert_exists("ci")
just.assert_depends_on("ci", ["test"], transitive=True)
Run:
uv run pytest -q
Quick start (repository workflow with justfile)
For this repository, a root justfile provides a live end-to-end example of using the toolkit.
Recommended first run sequence:
just setupjust checkjust corpus-buildjust corpus-queryjust corpus-lintjust corpus-refactor-plan
Optional apply mode (writes files and creates .bak backups):
just corpus-refactor-applyjust corpus-refactor-apply-no-validate
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
If you are contributing to this repository:
uv sync --extra dev
uv run ruff check .
uv run ty check
uv run pytest -q
Documentation workflow (Great Docs)
Great Docs configuration lives in great-docs.yml, with CI deployment in .github/workflows/docs.yml.
Local commands:
just docs-buildjust docs-previewjust docs-scanjust docs-check-links(prepublish profile, includes temporary ignores for first deploy URL and current generated source-link mismatch URLs)just docs-check-links-strict(no ignores; currently expected to surface source-link mismatch issues)just docs-workflow/just docs-workflow-strict
For setup details and GitHub Pages notes, see docs/GREAT_DOCS.md.
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
Release files for pytest-just 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pytest_just-0.1.3.tar.gz | 230.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pytest_just-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 254.8 kB
Release files / pytest_just-0.1.3.tar.gz
| Download URL | pytest_just-0.1.3.tar.gz |
|---|---|
| Size | 230.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c06dc9f1a27ec8fbd1958e1c0aee3609330d475465bc054456d0e72c0353c1c1
|
|
BLAKE2b-256 checksum How to use checksums |
ce68a82687dd6ef9b5a7da8196ad589648be3fcb7e432101fe696301793c834f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.0
|
Release files / pytest_just-0.1.3-py3-none-any.whl
| Download URL | pytest_just-0.1.3-py3-none-any.whl |
|---|---|
| Size | 24.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
03712803d25f2abeeec94cf7731940bd6e1ba73f63915e3feefcc0caf93d3641
|
|
BLAKE2b-256 checksum How to use checksums |
037e3458f96d7211d7d6658f19e9cd6b1944c6b30e36335c0f0e0760a7c93e18
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.0
|