Skip to main content

pytest-given

A pytest plugin that turns Given/When/Then annotated tests into interactive HTML reports.

Given your pytest tests,
when you narrate them with given / when / then,
then documentation and behavior fuse into one report.

What people and agents read is what the code does.

Inspired by JGiven (Java).

Documentation: https://nwilbert.github.io/pytest-given/latest/

Live examples:

Quick start

pip install pytest-given

Requires Python ≥ 3.14 (t-strings — PEP 750 — are part of the step-text API) and pytest ≥ 9.0.

If AI agents work in your repo, also install the bundled agent skills — with pytest-given's own command, or with library-skills alongside the skills of your other dependencies:

pytest-given skills install
# or
uvx library-skills install --claude

Then narrate a test:

import pytest
from pytest_given import attach, given, scenario, then, when


@pytest.fixture
@given('a coffee machine')
def machine():
    return {'coffees': 10, 'price': 2}


@scenario('Buy coffee', tags=['billing'])
def test_buy_coffee(machine):
    with when('I insert $2'):
        machine['coffees'] -= 1
    with then('I get a coffee'):
        assert machine['coffees'] == 9
        attach('Machine state', machine)

Run it:

pytest --given-html

This produces given-report/report.html — one file you can open directly in a browser.

Why pytest-given?

Classical BDD tools (Cucumber, behave, pytest-bdd) center on Gherkin, a natural-language DSL: stakeholders write the tests, and engineers maintain the glue code behind each step.

pytest-given works the other way round: engineers or their agents write normal tests, and pytest-given turns them into readable documentation. Stakeholders and domain experts can follow the HTML report without ever opening the test suite. Engineers get a view of the system's behavior that is easier to scan than test code, browsable by tag, glossary term, or module. The approach is the one JGiven pioneered for Java, brought to pytest.

  • Plain Python: no Gherkin, no .feature files, no parser.
  • Tests stay first-class pytest tests, and the report is a by-product.
  • Self-contained HTML: open it locally or attach it to a CI run, with no server and no external assets.

Written by agents, reviewed by people

More and more tests aren't written by hand. A person describes a scenario, an AI agent writes the test along with the code, and people review the narrated report instead of the test code. The diagram shows this loop, and Working with AI agents explains how to set it up.

A loop between people, agents, and artifacts: developers and domain experts instruct AI agents, which write annotated tests and code. The tests verify the code and generate a report that domain experts validate and developers review, feeding back to the agents.

Glossary and Domain Storytelling

pytest-given goes beyond JGiven by tying tests to the domain itself. A glossary defines the terms your team uses, and the report highlights them wherever a test mentions them. Domain Storytelling adds the big picture: stories of how the domain works, with the report showing which scenarios cover each sentence of a story.

Features

  • Step context managers: with given(...), when(...), then(...) blocks in plain pytest tests, nesting within a phase.
  • Narrated fixtures: @given on a fixture, or Annotated[..., given(...)] on a parameter, records setup as a step.
  • Parametrized scenarios: one narrated tree plus a parameter table per case, or one scenario per case on request.
  • Glossary: your domain's terms, declared in code or loaded from a GLOSSARY.md, rendered as highlighted term refs in the narration.
  • Domain Storytelling: Domain Stories as sequences of sentences, and per-sentence coverage in the report.
  • Narration lint: structural checks that a step's text is honest about its body: empty steps, a then that checks nothing, a missing phase.
  • Agent skills: bundled Agent Skills for authoring, navigating and reviewing narrated tests, installable with one command.

The full reference — pytest options, source links, the standalone CLI — is on the documentation site.

License

MIT. The bundled Alpine.js runtime is also MIT; its notice is in THIRD-PARTY-LICENSES.

Metadata

Release files for pytest-given 0.4.1

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-given 0.4.1
File Size Uploaded Provenance
pytest_given-0.4.1.tar.gz 516.7 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for pytest-given 0.4.1
File Interpreter ABI Platform
pytest_given-0.4.1-py3-none-any.whl Python 3 none any Details

Total release size: 823.4 kB

Release files / pytest_given-0.4.1.tar.gz

Download URL pytest_given-0.4.1.tar.gz
Size 516.7 kB
Tags Source
SHA-256 checksum
How to use checksums
e7581b37fc7e79622c134cfde263eb3428815906c53f1a590d156901674532e0
BLAKE2b-256 checksum
How to use checksums
dca6d0f0a59f42c9aaf90e9b271418a8061ea31b74e3d1b60a96e8608f9e4dfe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 4, 2026.

Transparency log

Release files / pytest_given-0.4.1-py3-none-any.whl

Download URL pytest_given-0.4.1-py3-none-any.whl
Size 306.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1794334437f3fc00d75a8a9f68e92888ada3cc8b64d006d89cbb3bb6d333bb8e
BLAKE2b-256 checksum
How to use checksums
7b0f179b6be6260d74b343d1a51b5c3c8d61daad62650eb011e8f84e2d45e557
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 4, 2026.

Transparency log

Security for pytest-given 0.4.1

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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for pytest_given-0.4.1.tar.gz

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 Oct 4, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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