Skip to content

bivex/fictional-meme

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

8 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ВСстированиС API с Schemathesis πŸš€

ΠŸΡ€ΠΈΠ²Π΅Ρ‚! Π­Ρ‚ΠΎ README ΠΏΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ нашСго API для Ρ€Π΅ΠΊΠ»Π°ΠΌΠ½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Schemathesis. ΠœΡ‹ Ρ‚ΡƒΡ‚ собрали всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для автоматичСского тСстирования OpenAPI спСцификаций - ΠΎΡ‚ простых ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π΄ΠΎ комплСксных сцСнариСв.

πŸ“‹ Π§Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ

πŸ—ΊοΈ OpenAPI БпСцификация (openapi.yaml)

Π­Ρ‚ΠΎ сСрдцС нашСго API - подробная докумСнтация всСх эндпоинтов, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΈ ошибок. БпСцификация описываСт:

  • Кампании: созданиС, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΠΏΠ°ΡƒΠ·Π°/Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅
  • Π›Π΅Π½Π΄ΠΈΠ½Π³ΠΈ: ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ посадочными страницами с A/B тСстированиСм
  • ΠžΡ„Ρ„Π΅Ρ€Ρ‹: настройка ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ с вСсами ΠΈ payout'Π°ΠΌΠΈ
  • Аналитика: Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΏΠΎ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΡƒ ΠΈ конвСрсиям
  • Клики: Ρ‚Ρ€Π΅ΠΊΠΈΠ½Π³ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° с fraud detection ΠΈ 5-level суб-Ρ‚Ρ€Π΅ΠΊΠΈΠ½Π³ΠΎΠΌ

πŸ–₯️ Mock Π‘Π΅Ρ€Π²Π΅Ρ€ (mock_server_g.py)

Flask-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ API. ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ совмСстимо с OpenAPI спСцификациСй:

  • βœ… ВсС эндпоинты Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹
  • βœ… ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ HTTP ΠΊΠΎΠ΄Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²
  • βœ… Валидация Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ схСмам
  • βœ… АутСнтификация (Bearer, Basic, API-Key)
  • βœ… Fraud detection для ΠΊΠ»ΠΈΠΊΠΎΠ²
  • πŸ”„ ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° CORS для тСстирования ΠΈΠ· Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°

πŸ§ͺ ВСстированиС с Schemathesis

Schemathesis - это инструмСнт для property-based тСстирования REST API. Он:

  1. Π§ΠΈΡ‚Π°Π΅Ρ‚ OpenAPI ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ
  2. Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ тСстовыС запросы Π½Π° основС схСм
  3. ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ запросы ΠΊ API
  4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ соотвСтствиС ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² спСцификации

🎯 ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° Schemathesis

  • АвтоматичСская гСнСрация тысяч тСстовых случаСв
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° edge cases (пустыС строки, null значСния, Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ²)
  • Property-based testing - Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π±Π°Π³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пропустят ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ тСсты
  • Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с pytest для CI/CD
  • ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… нСсоотвСтствиях

πŸš€ Быстрый старт

1. Запуск Mock Π‘Π΅Ρ€Π²Π΅Ρ€Π°

# Из Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ goservik/
python run_server_g.py

Π‘Π΅Ρ€Π²Π΅Ρ€ запустится Π½Π° http://127.0.0.1:8000

2. Установка Schemathesis

pip install schemathesis

3. Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ тСстированиС

# ВСстируСм всС эндпоинты
schemathesis run openapi.yaml --base-url=http://127.0.0.1:8000/v1

# Волько health check (быстрая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°)
schemathesis run openapi.yaml --base-url=http://127.0.0.1:8000/v1 --endpoint="/health"

# ВСстируСм ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΠΈ
schemathesis run openapi.yaml --base-url=http://127.0.0.1:8000/v1 --endpoint="/campaigns"

πŸ“Š ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ тСстов

Health Check

schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --endpoint="/health" \
  --checks=all

Кампании

# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΌΠΏΠ°Π½ΠΈΠΉ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --endpoint="/campaigns" \
  --checks=all \
  --hypothesis-max-examples=50

Click Tracking

# ВСстируСм ΠΊΠ»ΠΈΠΊΠΈ с суб-Ρ‚Ρ€Π΅ΠΊΠΈΠ½Π³ΠΎΠΌ
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --endpoint="/click" \
  --checks=all

πŸ”§ ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ

АутСнтификация

# Π‘ Bearer Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠΌ
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --header="Authorization: Bearer test_jwt_token_12345"

# Π‘ API Key
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --header="X-API-Key: test_api_key_abcdef123"

Π€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΈ ограничСния

# Волько GET запросы
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --method=GET

# ΠœΠ°ΠΊΡΠΈΠΌΡƒΠΌ 100 ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π½Π° эндпоинт
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --hypothesis-max-examples=100

# Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --checks=not response_schema_conformance

ΠžΡ‚Ρ‡Π΅Ρ‚Ρ‹

# JUnit XML для CI/CD
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --junit-xml=schemathesis-report.xml

# JSON ΠΎΡ‚Ρ‡Π΅Ρ‚
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --output=schemathesis-report.json

πŸŽͺ Π§Ρ‚ΠΎ провСряСт Schemathesis

βœ… Π‘Ρ…Π΅ΠΌΠ° ΠΎΡ‚Π²Π΅Ρ‚Π°

  • Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° JSON соотвСтствуСт OpenAPI схСмС
  • Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ (string, number, boolean, etc.)
  • ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚
  • Π€ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π²Π°Π»ΠΈΠ΄Π½Ρ‹ (email, date-time, UUID)

βœ… HTTP статусы

  • ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ для ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²
  • ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ ошибок (400, 401, 404, 500)
  • Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ спСцификации

βœ… ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ валидация

  • Query ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅
  • Path ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Π°Π»ΠΈΠ΄Π½Ρ‹
  • Request body соотвСтствуСт схСмС

βœ… Edge Cases

  • ΠŸΡƒΡΡ‚Ρ‹Π΅ строки ΠΈ null значСния
  • Π“Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Π΅ значСния (min/max)
  • Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ символы
  • ΠžΡ‡Π΅Π½ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ строки

🚨 Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Connection refused

# Π‘Π΅Ρ€Π²Π΅Ρ€ Π½Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½ - запусти Π΅Π³ΠΎ!
python run_server_g.py

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: 401 Unauthorized

# Π”ΠΎΠ±Π°Π²ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ для Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Ρ… эндпоинтов
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --header="Authorization: Bearer test_jwt_token_12345"

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Блишком ΠΌΠ½ΠΎΠ³ΠΎ тСстов

# ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΡŒ количСство ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --hypothesis-max-examples=20

πŸ“ˆ Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² CI/CD

GitHub Actions ΠΏΡ€ΠΈΠΌΠ΅Ρ€

name: API Tests
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Setup Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.9'

      - name: Install dependencies
        run: |
          pip install schemathesis flask gunicorn

      - name: Start mock server
        run: |
          python run_server_g.py &
          sleep 5

      - name: Run Schemathesis tests
        run: |
          schemathesis run openapi.yaml \
            --base-url=http://127.0.0.1:8000/v1 \
            --junit-xml=schemathesis-report.xml \
            --hypothesis-max-examples=50

      - name: Upload test results
        uses: actions/upload-artifact@v2
        if: always()
        with:
          name: schemathesis-results
          path: schemathesis-report.xml

🎯 Π›ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ

1. Начинай с ΠΌΠ°Π»ΠΎΠ³ΠΎ

# Π‘Π½Π°Ρ‡Π°Π»Π° протСстируй ΠΎΠ΄ΠΈΠ½ эндпоинт
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --endpoint="/health"

2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ Ρ€Π°Π·Π½Ρ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ

# Public endpoints (Π±Π΅Π· auth)
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --endpoint="/health"

# Bearer token endpoints
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --endpoint="/campaigns" \
  --header="Authorization: Bearer test_jwt_token_12345"

# API Key endpoints
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --endpoint="/clicks" \
  --header="X-API-Key: test_api_key_abcdef123"

3. ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅

# Π‘ΠΌΠΎΡ‚Ρ€ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ эндпоинты протСстированы
schemathesis run openapi.yaml \
  --base-url=http://127.0.0.1:8000/v1 \
  --show-errors-tracebacks \
  --verbosity=verbose

πŸŽ‰ Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Schemathesis - это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для автоматичСского тСстирования API. Он Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π±Π°Π³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ€ΡƒΡ‡Π½ΠΎΠΌ тСстировании, ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π²ΠΎΠΉ API Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ соотвСтствуСт OpenAPI спСцификации.

Mock сСрвСр Π² этом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ идСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для:

  • Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ API (TDD ΠΏΠΎΠ΄Ρ…ΠΎΠ΄)
  • ВСстирования ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²
  • Π”Π΅ΠΌΠΎ ΠΈ ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΠΉ
  • CI/CD ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ΠΎΠ²

Π£Π΄Π°Ρ‡ΠΈ Π² тСстировании! Если Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ - провСряй Π»ΠΎΠ³ΠΈ сСрвСра ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ --show-errors-tracebacks для Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. πŸš€

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages