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/.
Что генерируется?
-
Файлы тестов: Для каждого файла с маршрутами создается отдельный файл в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
-
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
-
pytest.ini: Файл конфигурации для pytest:[pytest] pythonpath = . . env_files = ./tests/test.env asyncio_mode = auto
-
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
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 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86bf7e5543eaaa83f3f2c427b3170d272c28244a3d9f5bd1a10c5de1902ed274
|
|
| MD5 |
52c4e37f52e6de604f6e54b7e58db429
|
|
| BLAKE2b-256 |
f1368f1767b6fe36b122be41dcd58352ccd5c81c74b6308e9d144e1b20e36a27
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0abcaf3ed869796f952bf4ad4dfe3990efbacc47412de3d2be6f070a6701a853
|
|
| MD5 |
7ab3b2c3b2f7e93d008b12aa79f36220
|
|
| BLAKE2b-256 |
847508f82fcd44d97154c6ad1b8b7c7a58d6afea0a10a5cefecea9140f5141e0
|