Skip to main content

Kubernetes test support with KIND for pytest

Project description

pytest-kind-ng

Tests PyPI PyPI - Python Version License CalVer

A maintained fork of pytest-kind

Test your Python Kubernetes app/operator end-to-end with kind and pytest.

pytest-kind-ng 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-ng as a development dependency with uv, e.g.:

uv add --dev pytest-kind-ng

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 cluster
  • kubectl(*args): run the kubectl binary 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 name
  • kubeconfig_path: the path to the Kubeconfig file to access the cluster
  • kind_path: path to the kind binary
  • kubectl_path: path to the kubectl binary
  • api: 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.

You can use the PYTEST_ADDOPTS environment variable to pass these options through the Taskipy test task:

# for test debugging: don't delete the kind cluster
PYTEST_ADDOPTS=--keep-cluster uv run task test

Notes

  • The kind_cluster fixture is session-scoped, i.e. the same cluster will be used across all test modules/functions.
  • The kind and kubectl binaries 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-cluster is 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.

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_kind_ng-22.11.1.tar.gz (19.2 kB view details)

Uploaded Source

Built Distribution

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

pytest_kind_ng-22.11.1-py3-none-any.whl (19.1 kB view details)

Uploaded Python 3

File details

Details for the file pytest_kind_ng-22.11.1.tar.gz.

File metadata

  • Download URL: pytest_kind_ng-22.11.1.tar.gz
  • Upload date:
  • Size: 19.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.7

File hashes

Hashes for pytest_kind_ng-22.11.1.tar.gz
Algorithm Hash digest
SHA256 7396cc291766e9217d63f3d5770bf6f4648dfebc4272801cd7c03d1cb0fbe0b3
MD5 8ee0f4b94ddb5d5670b99b2682e7aa30
BLAKE2b-256 d8d0b9883273ba614b3fadb352beff30b048a8c14bbc9c20eaceaeff63c63adb

See more details on using hashes here.

File details

Details for the file pytest_kind_ng-22.11.1-py3-none-any.whl.

File metadata

File hashes

Hashes for pytest_kind_ng-22.11.1-py3-none-any.whl
Algorithm Hash digest
SHA256 2c78c67a7970599d1cd8aa4025fd34aa0cb4352a2e5bc8e7618f1762b198cd56
MD5 f5ce80e6276b4e9b11980a79b05e6799
BLAKE2b-256 25bd8633b4d38d55bbb81ad2426dde18032f0774e5c1ad14af894e7f0bdb9d64

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