A pytest runner with bazel support
Project description
pytest-bazel
A pytest wrapper for supporting bazel's rule_python. This is supposed to be used via PyPI and no bazel rules will be exported for the time being.
Features
Features ported from rules_python_pytest:
- Basic ignoring of external directories.
- Support for pytest 8.0 and pytest 7.0 and handle running of tests when passing the filenames to the runner.
- Test sharding support using pytest-shard.
- Supporting filtering tests via
bazel test --test_filter <target>
.
Features ported from rules_py:
- Use
-p no:cacheprovider
Extra features implementing test_encyclopedia spec:
-
TEST_WARNINGS_OUTPUT_FILE
is used to outputwarnings.warn
usage. -
TEST_TMPDIR
is used -
TEST_RANDOM_SEED
is used for predictive tests, consider integrating with https://pypi.org/project/pytest-randomly/. - short circuit if not running under bazel (see
BAZEL_TEST
env var).
Extras that have tests:
- No passing of files as args is needed. Pytest discovery is working as expected. Note that this may not scale well with extremely large sandboxes. Please leave feedback in the repo.
- Recommendations on project structure (separate
tests
dir may facilitate integration withpytest
, but this needs further checking).
Usage
Install this by including it into your requirements.in
or pyproject.toml
file:
pytest-bazel[all]
And then you can use it as follows:
Pattern 1
Using it as an alternative to unittest.main()
in a py_test
rule.
import pytest_bazel
...
if __name__ == "__main__":
pytest_bazel.main()
# BUILD.bazel contents
load("@rules_python//python:py_test.bzl", "py_test")
py_test(
name = "my_test",
# ...
deps = ["@pypi//pytest_bazel"],
)
Pattern 2
Using it to create a macro, this shows how to create a replacement for the
rules_python_pytest
py_pytest_test
macro. The benefit is that this defines
all of the necessary files in a single place.
# pytest_test.bzl contents
load("@rules_python//python:py_library.bzl", "py_library")
load("@rules_python//python:py_test.bzl", "py_test")
load("@rules_python//python/entry_points:py_console_script_binary.bzl", "py_console_script_binary")
def pytest_test(name, srcs, **kwargs):
# this is only needed for passing srcs
deps = kwargs.pop("deps", [])
data = kwargs.pop("data", [])
env = kwargs.pop("env", {})
py_library(
name = name + ".lib",
srcs = srcs,
deps = deps,
data = data,
testonly = True,
**kwargs,
)
py_console_script_binary(
name = name,
pkg = "@pypi//pytest_bazel", # assuming your hub repo name is `pypi`.
script = "pytest_bazel",
binary_rule = py_test,
deps = [
# The test sources are here
name + ".lib",
# Add extra test deps below, e.g. for sharding support, etc.
],
data = data + srcs,
env = env,
testonly = True,
# The following is reusing the ideas defined in
# https://github.com/caseyduquettesc/rules_python_pytest/blob/main/python_pytest/defs.bzl
args = kwargs.get("args", []) + [
# Passing of srcs is optional and this is only to show how one
# would reimplement what `rules_python_pytest` has done.
"$(location :%s)" % x for x in srcs
],
**kwargs,
)
# BUILD.bazel contents
load("//:pytest_test.bzl", "pytest_test")
pytest_test(
name = "my_test",
# ...
deps = ["@pypi//pytest_bazel"],
)
Changelog
See changelog.
Contributing
This is right now too early to be contributed to code-wise, but issues welcome describing what you would like to have in this project.
Thanks
Special thanks to rules_python_pytest and rules_py projects that had some
great ideas how to integrate with pytest
. This attempts to unify all of the
approaches.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for pytest_bazel-0.1.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fbac2c016e9be6dbedfc79c4c071a89c7fa4f75cdd4ed86c17f172c6f717bd99 |
|
MD5 | f93d67b0f0aa7a418533c86babd2d47d |
|
BLAKE2b-256 | 4dd6aa1f34529ce3703cfec1ea608021930d74ef0336a1631f1bca94fb563193 |