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.
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 | |
|---|---|---|---|
| pytest-kind-22.11.1.tar.gz | 18.0 kB | 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
|