Skip to main content

Utility for generating tests for FastAPI routers and endpoints

Project description

FATestGenerator

FATestGenerator — это утилита для автоматической генерации тестов для API, созданных с использованием FastAPI. Библиотека позволяет быстро создавать тесты для ваших маршрутов и удобно организует их структуру.

Особенности

  • Генерация тестов для всех маршрутов FastAPI.
  • Поддержка асинхронного клиента httpx.
  • Автоматическая организация тестов по роутерам.
  • Генерация вспомогательных файлов:
    • conftest.py для фикстур и настройки окружения.
    • pytest.ini для конфигурации pytest.
    • .env файл для тестового окружения.

Установка

Добавьте FATestGenerator в ваш проект:

pip install fa-test-generator
poetry add fa-test-generator

Использование

Инициализация

from fastapi import FastAPI
from fa_test_generator import FATestGenerator

app = FastAPI()
# Инициализация вашего приложения FastAPI

generator = FATestGenerator(app, tests_dir="./tests/")
generator.generate()

Параметры конструктора

  • app (FastAPI): Ваше приложение FastAPI.
  • tests_dir (str, optional): Папка для хранения тестов. По умолчанию — ./tests/.

Что генерируется?

  1. Файлы тестов: Для каждого файла с маршрутами создается отдельный файл в tests/api/.

    Например, для роутера user_router лежащий в файле user_router.py:

     from fa_test_generator import FATestGenerator
     from fastapi import APIRouter, FastAPI, status
     from pydantic import BaseModel
    
     from models.user import User
     from services.user_service import UserService
    
     user_router = APIRouter()
    
    
     @user_router.get(
         path="/users/",
         status_code=status.HTTP_200_OK,
         response_model=list[User],
     )
     async def get_users():
         users = UserService.get_users()
         return users
    
    
     class UserCreateScheme(BaseModel):
         name: str = Field(
             title="Username",
             default="Unknown"
         )
    
    
     @user_router.post(
         path="/users/",
         status_code=status.HTTP_201_CREATED,
         response_model=User,
     )
     async def create_user(
         user_scheme: UserCreateScheme,
     ):
         user = UserService.create_user(user_scheme)
         return user
    
    
     app = FastAPI()
    
     app.include_router(user_router)
    
     if __name__ == "__main__":
         FATestGenerator(app, tests_dir="./tests/").generate()
    

    создается файл tests/api/test_user_router.py со структурой:

    from httpx import AsyncClient
    import jsony
    
    class TestUsers:
        async def test_get_users(self, client: AsyncClient):
            resp = await client.get("/users")
            assert resp.status_code == 200
    
         async def test_create_user(self, client: AsyncClient):
             data = {
                 "name": "annotation: str, title: Username, default: Unknown"
             }
            resp = await client.post("/users", json=jsony.normalize(data))
            assert resp.status_code == 2001
    
  2. conftest.py: Этот файл настраивает фикстуры и проверяет тестовое окружение.

    import os
    from dotenv import load_dotenv
    import pytest
    from asgi_lifespan import LifespanManager
    from httpx import AsyncClient, ASGITransport
    from main import app
    
    load_dotenv(dotenv_path="./tests/test.env")
    
    @pytest.fixture(scope="session", autouse=True)
    def check_mode():
        mode = os.getenv("MODE")
        if mode != "TEST":
            raise PermissionError(f"Environment variable MODE must be TEST. Current MODE = {mode}")
    
    @pytest.fixture()
    async def client():
        async with LifespanManager(app):
            async with AsyncClient(transport=ASGITransport(app=app), base_url="http://localhost") as ac:
                yield ac
    
  3. pytest.ini: Файл конфигурации для pytest:

    [pytest]
    pythonpath = . .
    env_files = ./tests/test.env
    asyncio_mode = auto
    
  4. test.env: Файл окружения для тестов:

    MODE=TEST
    

Как работает генерация тестов?

  • Классы тестов организуются по роутерам. Названия классов формируются автоматически на основе имени модуля.
  • Для каждого маршрута создается метод теста с заготовкой для проверки статуса ответа.
  • Если маршрут требует тело запроса, оно будет автоматически сгенерировано на основе модели FastAPI.

Пример сгенерированного метода теста:

async def test_create_user(self, client: AsyncClient):
    data = {
        "name": "John Doe",
        "age": 30
    }
    resp = await client.post("/users", json=data)
    assert resp.status_code == 201

Лицензия

Этот проект распространяется под лицензией MIT. Для получения подробной информации смотрите файл LICENSE.

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

fa_test_generator-0.1.2.tar.gz (4.5 kB view details)

Uploaded Source

Built Distribution

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

fa_test_generator-0.1.2-py3-none-any.whl (5.7 kB view details)

Uploaded Python 3

File details

Details for the file fa_test_generator-0.1.2.tar.gz.

File metadata

  • Download URL: fa_test_generator-0.1.2.tar.gz
  • Upload date:
  • Size: 4.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.0.1 CPython/3.12.3 Linux/5.15.0-1071-intel-iotg

File hashes

Hashes for fa_test_generator-0.1.2.tar.gz
Algorithm Hash digest
SHA256 86bf7e5543eaaa83f3f2c427b3170d272c28244a3d9f5bd1a10c5de1902ed274
MD5 52c4e37f52e6de604f6e54b7e58db429
BLAKE2b-256 f1368f1767b6fe36b122be41dcd58352ccd5c81c74b6308e9d144e1b20e36a27

See more details on using hashes here.

File details

Details for the file fa_test_generator-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: fa_test_generator-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 5.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.0.1 CPython/3.12.3 Linux/5.15.0-1071-intel-iotg

File hashes

Hashes for fa_test_generator-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 0abcaf3ed869796f952bf4ad4dfe3990efbacc47412de3d2be6f070a6701a853
MD5 7ab3b2c3b2f7e93d008b12aa79f36220
BLAKE2b-256 847508f82fcd44d97154c6ad1b8b7c7a58d6afea0a10a5cefecea9140f5141e0

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