Skip to main content

A pytest plugin that enforces test execution order via a dependency DAG

Project description

pytest-dag

pytest-dag logo

pytest-dag banner

Docs status

Documentation: https://pytest-dag.readthedocs.io/en/latest/

pytest-dag is a pytest plugin for dependency-aware test execution.

It lets tests declare dependencies, builds a DAG, runs tests in topological order, and skips downstream tests when required dependencies fail.

Installation

pip install pytest-dag

Quick Start

import pytest

def test_a():
    assert True

@pytest.mark.dag(depends=["test_a"])
def test_b():
    assert True

@pytest.mark.dag(depends=["test_b"])
def test_c():
    assert True

@pytest.mark.dag(depends=["test_b"])
def test_d():
    assert True

Expected run order:

test_a -> test_b -> (test_c, test_d)

If test_a fails, dependent tests are skipped with a clear reason:

SKIPPED pytest-dag: blocked by test_file.py::test_a (FAILED)

Marker Syntax

# Single dependency (string)
@pytest.mark.dag(depends="test_login")
def test_profile():
    ...

# Multiple dependencies (list)
@pytest.mark.dag(depends=["test_login", "test_db_connect"])
def test_dashboard():
    ...

# Cross-file dependency (full nodeid)
@pytest.mark.dag(depends=["tests/auth/test_auth.py::test_login"])
def test_profile():
    ...

YAML DAG

For larger suites, you can define dependencies in YAML instead of (or in addition to) markers.

pyproject.toml:

[tool.pytest.ini_options]
dag_file = "tests/dag.yaml"

tests/dag.yaml:

nodes:
  - id: tests/test_flow.py::test_a
  - id: tests/test_flow.py::test_b
    depends: [tests/test_flow.py::test_a]
  - id: tests/test_flow.py::test_c
    depends: [tests/test_flow.py::test_b]

Marker dependencies and YAML dependencies are unioned.

CLI Options

Option Default Description
--dag-strict / --no-dag-strict strict Missing dependency -> error (strict) or skip (lenient)
--dag-block-on OUTCOMES fail Outcomes that block dependents: fail, skip, xfail, error
--dag-dump off Print DAG order and edges after collection
--pytest-dag-license-key unset Provide license key directly
--pytest-dag-license-key-file unset Read license key from file

Examples:

# Cascade skipping (skip dependents when a dependency fails or is skipped)
pytest --dag-block-on fail,skip

# Missing deps become skips instead of collection errors
pytest --no-dag-strict

# Print computed graph for debugging
pytest --dag-dump

License Setup

pytest-dag may require a license key depending on current license policy.

Provide a license key using one of:

  • Environment variable: PYTEST_DAG_LICENSE_KEY
  • CLI value: --pytest-dag-license-key
  • Key file: --pytest-dag-license-key-file

Examples:

export PYTEST_DAG_LICENSE_KEY=pd-XXXX-XXXX-XXXX-XXXX
python -m pytest -v -rs
pytest --pytest-dag-license-key-file /path/to/key.txt -v -rs

Purchase or renew:

  • https://pytest-dag.slrsoft.ca/licenses/purchase

Support:

  • support@slrsoft.ca

Viewing Skip Reasons

Use -v -rs to see exact skip reasons:

pytest -v -rs

Example summary:

SKIPPED [2] pytest-dag: blocked by test_demo.py::test_login (FAILED)
SKIPPED [1] test_demo.py:104: feature not yet implemented

pytest-xdist Compatibility

pytest-dag is not compatible with pytest-xdist parallel execution (-n). To preserve DAG correctness, the plugin automatically disables xdist when it is active and prints a warning.

If xdist is installed but -n is not passed, nothing is changed.

Troubleshooting

plugins: ... dag-0.1.0 (not pytest-dag-0.1.0)

This is normal. Pytest shortens plugin names in output by dropping the pytest- prefix.

Plugin not loading in a virtualenv

If which pytest points to a global executable after activating a venv, use:

python -m pytest ...

This guarantees the venv interpreter and installed plugin are used.

License

Proprietary. Copyright (c) 2026 SLR Software Solutions Inc.

See the license terms in the repository LICENSE file.

Licensing inquiries: support@slrsoft.ca

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_dag-3.0.2.tar.gz (40.5 kB view details)

Uploaded Source

Built Distribution

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

pytest_dag-3.0.2-py3-none-any.whl (29.4 kB view details)

Uploaded Python 3

File details

Details for the file pytest_dag-3.0.2.tar.gz.

File metadata

  • Download URL: pytest_dag-3.0.2.tar.gz
  • Upload date:
  • Size: 40.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for pytest_dag-3.0.2.tar.gz
Algorithm Hash digest
SHA256 f6383c63d59f2314ccdd5bdc7a90409e3b8dba74ebeecaf475f1c931c1f3fe8a
MD5 af916ead1f61c9c9943c32e6319fb1cf
BLAKE2b-256 f87ca2848a17be9713abeaa1dcff0df504535c418e8cc768baa5ba2d65e2d87e

See more details on using hashes here.

File details

Details for the file pytest_dag-3.0.2-py3-none-any.whl.

File metadata

  • Download URL: pytest_dag-3.0.2-py3-none-any.whl
  • Upload date:
  • Size: 29.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for pytest_dag-3.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 7b392c70f86a79ea4c8d53a5311cfd4da585980e20d7b9aa4431e9d0222db64f
MD5 d16a708631637d01c01c7d7c677ed34a
BLAKE2b-256 9f723236b181bf9d94490ea0b15d02791b247926f7d35c6401598b02285fe493

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