Skip to main content

pytest-unmagic

Pytest fixtures with conventional import semantics.

pytest's fixtures are powerful, but they rely on "magic": a test requests a fixture by adding an argument whose name matches the fixture, and pytest resolves it at runtime by searching conftest.py files and plugins. Where a fixture comes from is not visible in the code, "go to definition" does not work, and fixtures cannot be applied to unittest.TestCase tests.

pytest-unmagic applies the principle that explicit is better than implicit: fixtures are imported, applied with a decorator, and called like ordinary Python objects. Every dependency is visible and easy to navigate. Unmagic fixtures coexist with standard pytest fixtures, so a project can adopt them gradually, one fixture at a time.

Installation

pip install pytest-unmagic

Usage

Define fixtures with the unmagic.fixture decorator, and apply them to other fixtures or test functions with unmagic.use.

from unmagic import fixture, use

traces = []

@fixture
def tracer():
    assert not traces, f"unexpected traces before setup: {traces}"
    yield
    traces.clear()

@use(tracer)
def test_append():
    traces.append("hello")
    assert traces, "expected at least one trace"

A fixture must yield exactly once. The @use decorator causes the fixture to be set up and registered for tear down, but does not pass the yielded value to the decorated function. This is appropriate for fixtures that have side effects.

The location where a fixture is defined has no affect on where it can be used. Any code that can import it can use it as long as it is executed in the context of running tests and does not violate scope restrictions.

@use shorthand

If a single fixture is being applied to another fixture or test it may be applied directly as a decorator without @use(). The test in the example above could have been written as

@tracer
def test_append():
    traces.append("hello")
    assert traces, "expected at least one trace"

Call a fixture to retrieve its value

The value of a fixture can be retrieved within a test function or other fixture by calling the fixture. This is similar to request.getfixturevalue().

@fixture
def tracer():
    assert not traces, f"unexpected traces before setup: {traces}"
    yield traces
    traces.clear()

def test_append():
    traces = tracer()
    traces.append("hello")
    assert traces, "expected at least one trace"

Learn more

The reference guide documents the rest of unmagic's features in detail, including:

  • Applying fixtures to test classes and unittest.TestCase tests
  • Fixture scopes and teardown
  • Autouse fixtures
  • Accessing pytest's request object and reusing @pytest.fixture fixtures
  • Chaining fixtures that depend on other fixtures
  • Erecting a fence to flag remaining magic-fixture usage

See CONTRIBUTING.md for how to run the test suite and publish a new release.

Metadata

Release files for pytest-unmagic 1.1.0

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-unmagic 1.1.0
File Size Uploaded
pytest_unmagic-1.1.0.tar.gz 9.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pytest-unmagic 1.1.0
File Interpreter ABI Platform
pytest_unmagic-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 19.5 kB

Release files / pytest_unmagic-1.1.0.tar.gz

Download URL pytest_unmagic-1.1.0.tar.gz
Size 9.3 kB
Tags Source
SHA-256 checksum
How to use checksums
cdde56c72296c2269e4d9eec8cdc67c84c82a431bef0114457ec4800a72ad84c
BLAKE2b-256 checksum
How to use checksums
c06c9e38b289b61686169ef3941f4f11958047ed055f34b54ac8f90e5901654d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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

Transparency log

Release files / pytest_unmagic-1.1.0-py3-none-any.whl

Download URL pytest_unmagic-1.1.0-py3-none-any.whl
Size 10.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8e98d551e9b165e1e8250299108e87a5f752a13c745f819df7a5f0ee9d4d4144
BLAKE2b-256 checksum
How to use checksums
24740ad96f4701284205fdefc4cefc711eb7ef593d559d13b4cbbf06b3969bd8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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

Transparency log

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 release files

1.0.1

2 release files

1.0.0

2 release files

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