pytest-kind
Test your Python Kubernetes app/operator end-to-end with kind and pytest.
pytest-kind is a plugin for pytest which provides the kind_cluster fixture.
The fixture will install kind 0.17.0, create a Kubernetes 1.25 cluster, and provide convenience functionality such as port forwarding.
Usage
Install pytest-kind via pip or via poetry, e.g.:
poetry add --dev pytest-kind
Write your pytest functions and use the provided kind_cluster fixture, e.g.:
def test_kubernetes_version(kind_cluster):
assert kind_cluster.api.version == ('1', '25')
To load your custom Docker image and apply deployment manifests:
import requests
from pykube import Pod
def test_myapp(kind_cluster):
kind_cluster.load_docker_image("myapp")
kind_cluster.kubectl("apply", "-f", "deployment.yaml")
kind_cluster.kubectl("rollout", "status", "deployment/myapp")
# using Pykube to query pods
for pod in Pod.objects(kind_cluster.api).filter(selector="app=myapp"):
assert "Sucessfully started" in pod.logs()
with kind_cluster.port_forward("service/myapp", 80) as port:
r = requests.get(f"http://localhost:{port}/hello/world")
r.raise_for_status()
assert r.text == "Hello world!"
See the examples directory for sample projects and also check out kube-web-view which uses pytest-kind for its e2e tests.
KindCluster object
The kind_cluster fixture is an instance of the KindCluster class with the following methods:
load_docker_image(docker_image): load the specified Docker image into the kind clusterkubectl(*args): run thekubectlbinary against the cluster with the specified arguments. Returns the process output as string.port_forward(service_or_pod_name, remote_port, *args): run "kubectl port-forward" for the given service/pod and return the (random) local port. To be used as context manager ("with" statement). Pass the namespace as additional args to kubectl via "-n", "mynamespace".
KindCluster has the following attributes:
name: the kind cluster namekubeconfig_path: the path to the Kubeconfig file to access the clusterkind_path: path to thekindbinarykubectl_path: path to thekubectlbinaryapi: pykube HTTPClient instance to access the cluster from Python
You can also use KindCluster directly without pytest:
from pytest_kind import KindCluster
cluster = KindCluster("myclustername")
cluster.create()
cluster.kubectl("apply", "-f", "..")
# ...
cluster.delete()
Pytest Options
The kind cluster name can be set via the --cluster-name CLI option.
The kind cluster is deleted after each pytest session, you can keep the cluster by passing --keep-cluster to pytest.
Note that you can use the PYTEST_ADDOPTS environment variable to pass these options to pytest. This also works if you call pytest from a Makefile:
# for test debugging: don't delete the kind cluster
PYTEST_ADDOPTS=--keep-cluster make test
Notes
- The
kind_clusterfixture is session-scoped, i.e. the same cluster will be used across all test modules/functions. - The
kindandkubectlbinaries will be downloaded once to the local directory./.pytest-kind/{cluster-name}/. You can use them to interact with the cluster (e.g. when--keep-clusteris used). - Some cluster pods might not be ready immediately (e.g. kind's CoreDNS take a moment), add wait/poll functionality as required to make your tests predictable.
Metadata
Release files for pytest-kind 22.11.1
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-kind-22.11.1.tar.gz | 18.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pytest_kind-22.11.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 36.5 kB
Release files / pytest-kind-22.11.1.tar.gz
| Download URL | pytest-kind-22.11.1.tar.gz |
|---|---|
| Size | 18.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ae7a4c753fcbbf9e44a0cc587d5219a0b8b2b1e7bcc9cbe14234f745dd5db681
|
|
BLAKE2b-256 checksum How to use checksums |
28bc5816716a372636e90251bbf81a2d51c2eb340dc77cb5e7237c1a455fa3f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.1.13 CPython/3.10.2 Linux/5.4.0-132-generic
|
Release files / pytest_kind-22.11.1-py3-none-any.whl
| Download URL | pytest_kind-22.11.1-py3-none-any.whl |
|---|---|
| Size | 18.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
35fd99e4f94e0374834b5893ee4a95e33ad5dc1c18080356f01fadf21224e830
|
|
BLAKE2b-256 checksum How to use checksums |
7df2c9eda764e0a32b8c14eab539d6dcb409d7b1cabaceb5caa9db89c769b2f0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.1.13 CPython/3.10.2 Linux/5.4.0-132-generic
|
Security for pytest-kind 22.11.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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
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.