Skip to main content

Framework for fast Е2Е API testing

Project description

E2Efast

PyPI version Python versions GitHub Actions Coverage Status License: MIT Downloads Code style: ruff

Generate Python HTTP clients, fixtures, and integration tests from a single OpenAPI specification

🚀 Overview

E2Efast wraps the restcodegen toolkit and adds project-specific generators that organise REST clients, user-facing facades, pytest fixtures, and optional integration tests. One CLI command keeps these artefacts in sync so teams can iterate quickly on backend contracts.

✨ Key Features

  • One-command workflow – Generate clients, fixtures, and tests with a single CLI invocation.
  • Safe regeneration – Internal clients are regenerated automatically while editable facades live under framework/clients/http for manual customisations.
  • Fixture suite versions – Choose per-client fixtures (suite v1) or aggregated service fixtures and tests (suite v2).
  • Custom HTTP layer – Override a single ClientClass alias to switch between httpx.Client, AsyncClient, or your own subclass across all fixtures.

📚 Example Project

Want to see a complete scaffold created by e2efast? Check out the sample repository: e2efast-project-example.

⚡ Quick Start

  1. Install project dependencies with Poetry:

    poetry install
    
  2. Run the generator (adjust service name/spec as needed). The --spec option accepts either a local file path or an HTTP(S) URL:

    poetry run e2efast customers --spec ./crm_v2_service.json --with-tests
    
  3. Open framework/settings/base_settings.py and provide host values for the generated fields. The settings generator appends new services on subsequent runs, so you normally only fill in the URLs.

  4. Environment variables are optional: leave them unset to rely on Settings() defaults, or export overrides before executing tests:

    export CUSTOMERS_BASE_URL="https://api.example.test"
    
  5. Need only clients and fixtures (without tests)? Run the same command with --with-fixtures (the --spec option still accepts a path or URL):

    poetry run e2efast customers --spec ./crm_v2_service.json --with-fixtures --suite-version v2
    

📦 Installation

Install the library itself from PyPI:

pip install e2efast

🔧 CLI Usage

Run the generator by providing the service name and OpenAPI spec location (path or URL):

poetry run e2efast customers --spec ./crm_v2_service.json --with-tests --suite-version v2

Command Options

Parameter Description Required Default
service (argument) Logical service name used for packages/modules
--spec / spec_url Path or URL to the OpenAPI document
--with-fixtures Generate fixtures in addition to clients False
--with-tests Generate tests (fixtures implied) False
--suite-version Fixture/test style: v1 (per-client) or v2 (service facade) v2

The CLI parses the specification once and reuses the resulting parser for each generator, ensuring all outputs remain consistent.

📁 Generated Structure

├── framework                          # User-facing extension layer
│    ├── clients
│    │    └── http
│    │         └── <service>/          # Editable client wrappers (safe to modify)
│    ├── fixtures
│    │    └── http
│    │         ├── base.py             # Define ClientClass alias (editable)
│    │         └── <service>.py        # Generated fixtures (overwritten on regen)
│    └── settings
│         └── base_settings.py         # Pydantic settings scaffold (generated once)
│
├── internal                           # Auto-regenerated low-level clients
│    └── clients
│         └── http
│              └── <service>/
│                  ├── apis            # Generated API client classes
│                  └── models          # Pydantic models
│
└── tests                              # Generated or custom test suites
     ├── conftest.py                   # pytest plugin registration (generated once)
     └── http
          └── <service>/               # Generated test suite (if enabled)

Re-run the CLI whenever the OpenAPI spec changes; generated files are overwritten, while your custom facades remain intact.

🔄 Custom HTTP Client

Every fixture imports ClientClass from framework/fixtures/http/base.py. Update this alias to point at any httpx.Client subclass and regenerated fixtures automatically adopt the change.

from functools import partial

import httpx

ClientClass = partial(httpx.Client, timeout=httpx.Timeout(60.0))

# Example override:
# from httpx import AsyncClient
# ClientClass = AsyncClient

The base.py file is generated only when missing, so manual overrides are preserved across subsequent runs.

🧩 Wiring Fixtures into pytest

The generated tests/conftest.py uses get_fixtures() to auto-register fixture modules. If you add your own fixture packages, extend the returned list or append entries to pytest_plugins inside that file.

🌐 Environment Variables

framework/settings/base_settings.py is generated once and then updated incrementally: new services are appended as optional str fields with matching alias names. Provide host values directly in the file or override via environment variables (pattern <PACKAGE_NAME_UPPER>_BASE_URL).

🛠️ Development Workflow

poetry install           # Install dependencies
poetry run pytest        # Run tests
poetry run ruff check .  # Lint (example command)

Generators call format_file on their output directories to keep generated code tidy automatically.

📄 License

This project is distributed under the MIT License. See LICENSE for details.

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

e2efast-1.0.0.tar.gz (18.9 kB view details)

Uploaded Source

Built Distribution

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

e2efast-1.0.0-py3-none-any.whl (32.3 kB view details)

Uploaded Python 3

File details

Details for the file e2efast-1.0.0.tar.gz.

File metadata

  • Download URL: e2efast-1.0.0.tar.gz
  • Upload date:
  • Size: 18.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for e2efast-1.0.0.tar.gz
Algorithm Hash digest
SHA256 cffc779170d684085c879e86c223da51e942faf7f1205bdfac9178c58c49f3fa
MD5 06eb04fa0a172d75221231071a4866ff
BLAKE2b-256 cb9c349b0615c1ddfffcbf239db052e964ac7425f87e347b6e3d1d0d4eb475c0

See more details on using hashes here.

File details

Details for the file e2efast-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: e2efast-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 32.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for e2efast-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 094d53ae5e4db93cc18864e26119affc0674bbd93e696cdfdc18c64262bc6cf3
MD5 5b217612473282b6440da490153c867d
BLAKE2b-256 0dfbcdba804970e091921e4a633ee149ffb6427f5c9b4e51f747935e8609b11d

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