Add your description here
Project description
Pytest plugin for jubilant.
Eases the transition from pytest-operator to jubilant. And some cool stuff on top.
Fixtures
juju
This is a module(and model!)-scoped fixture that, by default, uses a temporary model and tears it down on context exit.
Cfr. the --model, --keep-models, and --no-teardown options below for more.
Usage:
from jubilant import Juju, all_active
def test_deploy(juju: Juju):
juju.deploy("./foo.charm", "foo")
juju.wait(
lambda status: all_active(status, "foo"),
timeout=1000
)
temp_model_factory
This is a module-scoped fixture that manages temporary models for your test runs.
It is what the juju fixture is using behind the scenes.
Especially useful if you have test cases that require multiple models.
import pytest
from jubilant import Juju, all_active
@pytest.fixture
def istio(temp_model_factory):
yield temp_model_factory.get_juju(suffix="istio")
def test_cmr(juju: Juju, istio: Juju):
istio.deploy("istio-k8s", "istio")
istio.wait(
lambda status: all_active(status, "istio"),
timeout=1000
)
juju.deploy("./foo.charm", "foo")
juju.wait(
lambda status: all_active(status, "foo"),
timeout=1000
)
juju.cli("offer", "foo:bar")
istio.cli("consume", f"{juju.model}:foo")
istio.cli("relate", "istio", "foo:bar")
This test will spin up two temporary models, one called test-cmr-<randomhex>, and one called test-cmr-<randomhex>istio,
and tear them down on context exit.
This fixture can be used with the options described below:
pytest tests/test_cmr.py --keep-modelswill skip model teardown for all generated models.pytest tests/test_cmr.py --model test-cmr-<randomhex>will usetest-cmr-<randomhex>as base name, and the suffixes you defined in the fixtures will give all generated models predictable names, which means that the tests will reuse the existing models (if found) or create new ones with those names.pytest tests/test_cmr.py --switchwill switch you to the 'base' modeltest-cmr-<randomhex>(not to one of the suffixed ones!).
Pytest CLI options
--model
Target a specific, existing model instead of provisioning a fresh, temporary one. Do note that this model won't be torn down at the end of the test run. Usage:
juju add-model mymodel
pytest ./tests/integration -k test_foo --model "mymodel"
--switch
Switch to the (randomly-named) model that is currently in scope, so you can keep an eye on the juju status as the tests progress. (Won't work well if you're running multiple test modules in parallel.)
pytest ./tests/integration --switch
--keep-models
Skip destroying the newly generated models when the tests are done. Usage:
pytest ./tests/integration --keep-models
--no-teardown
Skip all tests marked with teardown. Useful to inspect the state of a model after a (failed) test run.
pytest ./tests/integration --no-teardown
--no-setup
Skip all tests marked with setup. Especially useful when re-running a test on an existing model which is already set-up, but not torn down.
See this article for the idea behind this workflow.
Usage:
pytest ./tests/integration --no-teardown # make a note of the temporary model name
pytest ./tests/integration --model <temporary model name> --no-setup
Markers
setup
Marker for tests that prepare (parts of) a model.
Usage:
import pytest
@pytest.mark.setup
def test_deploy(juju):
juju.deploy("A")
juju.deploy("B")
@pytest.mark.setup
def test_relate(juju):
juju.integrate("A", "B")
teardown
Marker for tests that destroy (parts of) a model.
Usage:
import pytest
@pytest.mark.teardown
def test_disintegrate(juju):
juju.remove_relation("A", "B")
@pytest.mark.teardown
def test_destroy(juju):
juju.remove_application("A")
juju.remove_application("B")
Utilities
pack
Wrapper around charmcraft pack to build a charm and return the packed charm path and its resources, ready to be passed to juju.deploy.
from pytest_jubilant import pack, get_resources
import pytest
@pytest.mark.setup
def test_build_deploy_charm(juju):
charm_root = "/path/to/foo-charm-repo-root-dir/"
juju.deploy(
pack(charm_root),
"foo",
# the resources can only be inferred from the charm's metadata/charmcraft yaml
# if you use the `upstream-source` convention
resources=get_resources(charm_root),
num_units=3,
)
# example /path/to/foo-charm-repo-root-dir/charmcraft.yaml
# [snip]
resources:
nginx-image:
type: oci-image
description: OCI image for nginx
upstream-source: ubuntu/nginx:1.24-24.04_beta
nginx-prometheus-exporter-image:
type: oci-image
description: OCI image for nginx-prometheus-exporter
upstream-source: nginx/nginx-prometheus-exporter:1.1.0
DEVELOPERS
To release:
# obtain the current latest version out there
git tag | tail -n 1
new_tag="v0.5" # for example!
git tag $new_tag -m "new fancy feature"
git push origin head --tag
Once the PR is merged, the release CI will kick in and put the tag in pytest_jubilant.version.py
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pytest_jubilant-0.6.tar.gz.
File metadata
- Download URL: pytest_jubilant-0.6.tar.gz
- Upload date:
- Size: 10.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
54fadceb43cda6d156e5821bf9d28d62c2e62615f52dd3317f19582e60853e6d
|
|
| MD5 |
16a0aa7af98c1f2556f687be25ed13c9
|
|
| BLAKE2b-256 |
ccdcdbaed33467f78ae6af04b3e9c77e15eb631379c8ad83a4bab05d2a4a7ecf
|
Provenance
The following attestation bundles were made for pytest_jubilant-0.6.tar.gz:
Publisher:
build-and-publish.yaml on canonical/pytest-jubilant
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pytest_jubilant-0.6.tar.gz -
Subject digest:
54fadceb43cda6d156e5821bf9d28d62c2e62615f52dd3317f19582e60853e6d - Sigstore transparency entry: 243719144
- Sigstore integration time:
-
Permalink:
canonical/pytest-jubilant@15ce4176ebf12348cbff488a8ab56c47725bc46a -
Branch / Tag:
refs/tags/v0.6 - Owner: https://github.com/canonical
-
Access:
internal
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-and-publish.yaml@15ce4176ebf12348cbff488a8ab56c47725bc46a -
Trigger Event:
push
-
Statement type:
File details
Details for the file pytest_jubilant-0.6-py3-none-any.whl.
File metadata
- Download URL: pytest_jubilant-0.6-py3-none-any.whl
- Upload date:
- Size: 10.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6272a5e9c7373de3b09e51783c69ad4966b43e7eb59636c6c35298c25c03a77
|
|
| MD5 |
cacca693dbde96e9212556f50d86f810
|
|
| BLAKE2b-256 |
36b212fe0469b1bec474c186ef0e2e0f279ddfa5e6f5629f13e4fed350fc31e3
|
Provenance
The following attestation bundles were made for pytest_jubilant-0.6-py3-none-any.whl:
Publisher:
build-and-publish.yaml on canonical/pytest-jubilant
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pytest_jubilant-0.6-py3-none-any.whl -
Subject digest:
f6272a5e9c7373de3b09e51783c69ad4966b43e7eb59636c6c35298c25c03a77 - Sigstore transparency entry: 243719147
- Sigstore integration time:
-
Permalink:
canonical/pytest-jubilant@15ce4176ebf12348cbff488a8ab56c47725bc46a -
Branch / Tag:
refs/tags/v0.6 - Owner: https://github.com/canonical
-
Access:
internal
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-and-publish.yaml@15ce4176ebf12348cbff488a8ab56c47725bc46a -
Trigger Event:
push
-
Statement type: