Skip to main content

partest

Methodology-driven API (and optional UI) autotest harness for Python, with OpenAPI coverage that measures whether the right test cases exist — not just whether an endpoint was called.

pip install partest
pip install 'partest[ui]'     # + Playwright and Pillow for UI suites

What you get

  • ApiClient — async HTTP for suites: JSON, form, files, raw content=, multi-status expectations, GraphQL, and rich status-mismatch errors.
  • Coverage by methodology — every operation is classified into a method subtype, and each subtype has a required set of test cases. The report tells you which cases are missing.
  • A UI methodology too — surface types (list, form, card, shell, dialog, report), the check families each one owes, and the depth each check has to reach. The surface type is declared by your page object: nothing guesses it from markup.
  • A scaffold, if you want one — partest-gen is a separate package that writes a runnable suite straight from an OpenAPI file.
  • Reporting — check_* helpers, Allure steps and attaches (Allure is a soft dependency), interactive HTML coverage, coverage.json, compare / badge / stub CLI.
  • Auth, tracking, security — OIDC TokenManager with injected credentials, created-resource tracking with LIFO cleanup, SecHttp raw transport, JWT tampering sets, RiskProfile.
  • UI extra — BasePage, PageMonitor, storage helpers, visual comparison, baseline capture.

A first test

confpartest.py next to pytest.ini names the specification coverage is measured against — swagger_files = {"api": ["url", "https://api.example.com/openapi.json"]} — and pythonpath = . in pytest.ini keeps the suite root importable.

import pytest

from partest import ApiClient, BaseModelWithConfig, BaseResponseValidator, TypesTestCases
from partest.zorro_report import zorro

types = TypesTestCases


class Item(BaseModelWithConfig):
    id: int
    name: str


class ItemValidation(BaseResponseValidator):
    @property
    def ResponseSuccessBody(self):
        return Item


@pytest.fixture(scope="session")               # usually in conftest.py
def api_client():
    return ApiClient("https://api.example.com")


@pytest.mark.asyncio
async def test_get_item(api_client):
    """Item is returned by id."""
    await api_client.make_request(
        "GET",
        "/items",
        add_url1="/1",                    # on the wire: /items/1
        defining_url="/items/{id}",       # OpenAPI template — this is what coverage matches
        expected_status_code=200,
        validate_model=ItemValidation(),  # an instance, not the class
        type=types.request_default,       # explicit type beats inference
    )


def test_zorro():
    report = zorro()                      # Allure summary + coverage HTML
    # report.endpoints[*].missing_p1 → your backlog for the next test cases

Scaffold a whole suite

The generator ships separately, as partest-gen — it runs once when a project is created rather than on every test run, so it is not part of this install:

pip install partest-gen        # brings partest with it
partest-gen from-openapi ./my-suite --file openapi.yaml --depth p1 --with-ui
partest-gen sync-openapi ./my-suite --depth p1     # after the spec changes

--depth resources emits paths and collections, default adds payloads, validators and the first tests, p1 adds the full priority-one stub matrix plus a checklist per tag.

Upgrading from a version where the generator lived inside this package? partest.project_gen still resolves once partest-gen is installed, and pip install 'partest[gen]' installs both. The partest-gen command itself now comes from that package, not this one.

Documentation

Source, issues and the full documentation wiki: https://github.com/Dec01/partest

The user-facing pages also ship inside the package, so they are readable next to your installed copy without a trip to the browser:

python -m partest.docs list                  # what is available
python -m partest.docs show howto-quickstart # read a page
python -m partest.docs path                  # where the files live

Included: quickstart, migration notes, the coverage methodology, permissions, upload testing, reporting, security, UI, recipes, layers, and enterprise notes (shared client, retries, redaction, xdist). The decisions behind them — why coverage is scored this way, what stays in your project — live in the repository, not the wheel.

Or from Python:

from partest.docs import list_docs, read_doc
print(read_doc("concepts-methodology.md"))

Requirements

Python 3.10+, with the suite run on 3.10 and 3.14. Core dependencies: httpx, pydantic, pyyaml, pytest, pytest-asyncio, allure-pytest, requests, python-dotenv, Faker, matplotlib. The ui extra adds playwright and Pillow.

pytest 9 is required from 2.1.0 on (pytest>=9.0.3,<10). The advisory that raised the floor, PYSEC-2026-1845, has no fix in any 8.x release, so pytest 8 is not supported rather than deprecated — stay on partest 2.0.1 if you cannot move yet. The ceiling is there because partest is a pytest plugin and loads in every session: it says pytest 9 was run and pytest 10 was not, and it is lifted by a patch release once the suite passes on 10.

The bundled pytest plugin loads automatically and enriches Allure titles. Turn it off with PARTEST_PYTEST_PLUGIN=0, pytest_plugin = False in confpartest.py, or pytest -p no:partest if your project already owns Allure hooks.

License

MIT.

Metadata

Release files for partest 2.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for partest 2.6.0
File Size Uploaded
partest-2.6.0.tar.gz 311.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for partest 2.6.0
File Interpreter ABI Platform
partest-2.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 632.5 kB

Release files / partest-2.6.0.tar.gz

Download URL partest-2.6.0.tar.gz
Size 311.4 kB
Tags Source
SHA-256 checksum
How to use checksums
f8e8065cda3e3d96ed8a36b6457a796c452a47a902a00efd7312d0170eca553d
BLAKE2b-256 checksum
How to use checksums
819c365e0abe6a921217b1dbdc810b0a442136a54ddea7f4d270a8c6b492d295
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.10.11

Release files / partest-2.6.0-py3-none-any.whl

Download URL partest-2.6.0-py3-none-any.whl
Size 321.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a56f21430baa5167e97cead2ee0b903513bc389c0ca029fe29c8b89d58f95ec7
BLAKE2b-256 checksum
How to use checksums
171c7613cfbaa81b6c5423702c994d5cd56d0728eb2caf443ca3e5011cbc04f9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.10.11

Release history Release notifications | RSS feed

This release

2.6.0 This release

2 release files

2.5.0

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.8.1

2 release files

1.8.0

2 release files

1.7.1

2 release files

1.7.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.3

2 release files

1.3.0

2 release files

0.3.0

2 release files

0.2.19

2 release files

0.2.18

2 release files

0.2.17

2 release files

0.2.16

2 release files

0.2.15

2 release files

0.2.14

2 release files

0.2.13

2 release files

0.2.12

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.76

2 release files

0.1.75

2 release files

0.1.74

2 release files

0.1.73

2 release files

0.1.72

2 release files

0.1.71

2 release files

0.1.70

2 release files

0.1.69

2 release files

0.1.68

2 release files

0.1.67

2 release files

0.1.66

2 release files

0.1.65

2 release files

0.1.64

2 release files

0.1.63

2 release files

0.1.62

2 release files

0.1.61

2 release files

0.1.60

2 release files

0.1.59

2 release files

0.1.58

2 release files

0.1.57

2 release files

0.1.56

2 release files

0.1.55

2 release files

0.1.54

2 release files

0.1.53

2 release files

0.1.52

2 release files

0.1.51

2 release files

0.1.50

2 release files

0.1.49

2 release files

0.1.48

2 release files

0.1.47

2 release files

0.1.46

2 release files

0.1.45

2 release files

0.1.44

2 release files

0.1.43

2 release files

0.1.42

2 release files

0.1.41

2 release files

0.1.40

2 release files

0.1.39

2 release files

0.1.38

2 release files

0.1.37

2 release files

0.1.36

2 release files

0.1.35

2 release files

0.1.34

2 release files

0.1.33

2 release files

0.1.32

2 release files

0.1.9

2 release files

0.1.8

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page