pytest-databricks-lakeflow
Test the Lakeflow Jobs in your Databricks Asset Bundle with plain pytest. Each test gets a throwaway copy of a job, or of one task, runs it with the parameters the test chooses, asserts on the result, and deletes the copy.
What you get
- A job test is a pytest test.
assert,parametrize, fixtures and pytest-xdist work as they do everywhere else. Tests that need a workspace get thelakeflowmarker, sopytest -m "not lakeflow"keeps the fast suite fast. - The deployed jobs are never run. Every test runs its own copy, named and tagged after the test, with schedules, triggers, notifications and
run_asremoved. Copies run in parallel and are deleted when the test ends, unless it failed. - Results you can assert on.
run.task("transform")gives the task's state, output, logs, error, resolved parameters, task values, SQL rows, pipeline update, dbt artefacts and what a failed notebook printed. - One task at a time. Task values are not exposed by the Jobs API, so
lakeflow.task("job.task")runs a single task between a stub task that sets the upstream values you choose and a probe task that reads the values it set. - Test data without a seed task.
setup=andteardown=run a plain function with the realsparkanddbutils, a list of SQL statements or a notebook file as the first and last tasks of the copy.lakeflow.schema()gives each test a temporary schema. - Pipelines too.
pipelines="copy"points a job's pipeline tasks at copies that publish to the test's schema, andlakeflow.pipeline()copies one pipeline on its own. - Failures explain themselves. A failed assertion names the failing tasks with their errors and links to the run. The job is kept for you to open,
--lakeflow-debug-notebookwrites a notebook that replays the failed task, and--lakeflow-report-dirkeeps every run's output as a CI artefact. - Wiring checks without a run.
lakeflow.check("my_job")lists the mistakes thatbundle validatepasses, such as an undeclared{{job.parameters.x}}, andpytest --lakeflow-checkcollects one check per bundle job.
Quickstart
You need Python 3.11 or later, the Databricks CLI v1.7.0 or later on PATH, credentials that both the CLI and the SDK can use (a ~/.databrickscfg profile or the DATABRICKS_* variables), a workspace with serverless jobs, and a Databricks Asset Bundle with at least one job.
uv add --dev pytest-databricks-lakeflow
Or pip install pytest-databricks-lakeflow. Add a test target to databricks.yml. Development mode pauses schedules, and the separate root_path keeps the test deployment apart from your dev deployment:
targets:
test:
mode: development
workspace:
root_path: ~/.bundle/${bundle.name}/test
Write a test. This one runs my_example_job from the example bundle; swap in your own job and task keys:
from pytest_databricks_lakeflow import Lakeflow
def test_job_succeeds(lakeflow: Lakeflow) -> None:
with lakeflow.job("my_example_job", params={"param1": "hello", "param2": "world"}) as job:
run = job.run()
run.raise_for_failure()
assert run.task("transform").output == "hello world"
assert "Success! hello" in run.task("my_wheel_task").logs
Run pytest. The first test deploys the bundle's test target once, then every test creates, runs and deletes its own job. Write assert run.succeeded, run and a failure reads:
AssertionError: JobRun('my_example_job', FAILED, https://<workspace>/#job/123/run/456, params={'param1': 'forbidden', 'param2': 'world', 'mode': 'full', 'schema': ''}, failing=['transform: PermissionError: forbidden may not read /Volumes/example/raw/landing'])
To test one task, name it as job_key.task_key, give the upstream task values it reads, and capture the values it sets:
def test_transform(lakeflow: Lakeflow) -> None:
with lakeflow.task(
"my_example_job.transform",
params={"param1": "hello", "param2": "world"},
upstream_task_values={"extract": {"row_count": 42, "source_path": "/Volumes/x/y/z"}},
capture_task_values=["rows_written"],
) as task:
run = task.run()
assert run.succeeded, run
assert run.task("transform").output == "hello world"
assert run.task("transform").task_values["rows_written"] == 42
To change the target, set a catalog for temporary schemas or lengthen the timeout, override the lakeflow fixture in conftest.py:
from datetime import timedelta
import pytest
from pytest_databricks_lakeflow import Lakeflow
@pytest.fixture(scope="session")
def lakeflow() -> Lakeflow:
return Lakeflow(target="test", catalog="dev_sandbox", timeout=timedelta(minutes=20))
Where next
The docs site is at https://stevenayers.github.io/pytest-databricks-lakeflow/.
- Getting started: from an installed plugin to a passing test against your own bundle.
- Job tests and task tests: the two kinds of test and what a run gives back.
- Recipes: an "I want to..." index covering every option, from disabling a task to running the suite in CI.
- Reference: every
Lakeflowargument, command-line flag, environment variable and report format, the API, and the limitations. - How it works and the FAQ.
Contributing and licence
Bug reports and pull requests are welcome. See CONTRIBUTING.md for the development setup, the test suites and how releases work, and SUPPORT.md for where to ask questions.
Apache-2.0. See LICENSE.
Metadata
Release files for pytest-databricks-lakeflow 0.13.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pytest_databricks_lakeflow-0.13.0.tar.gz | 368.5 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pytest_databricks_lakeflow-0.13.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 538.5 kB
Release files / pytest_databricks_lakeflow-0.13.0.tar.gz
| Download URL | pytest_databricks_lakeflow-0.13.0.tar.gz |
|---|---|
| Size | 368.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a96bc5c7663895922e9b92055802049d3d516ec4c114809f444aabad13d82cbf
|
|
BLAKE2b-256 checksum How to use checksums |
66984fdf736f0fbbf4b7bd9420eb2e6f5dbcc7ab2d2074bcb636f9c401cfd0ce
|
| 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 20, 2026.
Transparency logRelease files / pytest_databricks_lakeflow-0.13.0-py3-none-any.whl
| Download URL | pytest_databricks_lakeflow-0.13.0-py3-none-any.whl |
|---|---|
| Size | 170.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
51301d78c24d16a066661cfe33552676cab2a599c9bf730142db296422402817
|
|
BLAKE2b-256 checksum How to use checksums |
491d474dccf88ac96e1b733c5e27345da06b70e5070292a42efe83ffe5dd76b4
|
| 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 20, 2026.
Transparency logSecurity for pytest-databricks-lakeflow 0.13.0
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.
Attestation for pytest_databricks_lakeflow-0.13.0.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 20, 2026.
Transparency logA 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.