10 промтов для написания unit-тестов и интеграционных тестов: от новичка до эксперта

Введение

Unit-тесты и интеграционные тесты — это не роскошь, а необходимость для любого серьёзного проекта. По данным отчёта State of DevOps 2023 от DORA (Google Cloud), команды с высоким уровнем автоматизации тестирования в 2.5 раза чаще достигают высокой скорости поставки. Однако написание качественных тестов требует времени и опыта. Современные AI-модели, такие как GPT-4 и Claude 3, могут ускорить этот процесс, если правильно составить промт. В этой подборке — 10 проверенных промтов для pytest, Jest и unittest, которые помогут сгенерировать тесты для разных сценариев.

1. Базовый промт для unit-теста на pytest

Задача: Написать unit-тест для функции обработки данных.

Промт:

Напиши unit-тест на pytest для функции `calculate_discount(price: float, discount_percent: float) -> float`, которая возвращает цену со скидкой. Учти граничные случаи: discount_percent = 0, discount_percent = 100, price = 0. Используй фикстуры.

Пример результата:

import pytest

@pytest.fixture
def sample_price():
    return 100.0

def test_calculate_discount_normal(sample_price):
    assert calculate_discount(sample_price, 10) == 90.0

def test_calculate_discount_zero_percent(sample_price):
    assert calculate_discount(sample_price, 0) == 100.0

def test_calculate_discount_full(sample_price):
    assert calculate_discount(sample_price, 100) == 0.0

def test_calculate_discount_zero_price():
    assert calculate_discount(0, 50) == 0.0

def test_calculate_discount_negative():
    with pytest.raises(ValueError):
        calculate_discount(100, -10)

2. Промт для интеграционного теста с базой данных

Задача: Проверить взаимодействие с PostgreSQL через SQLAlchemy.

Промт:

Напиши интеграционный тест на pytest для функции, которая сохраняет пользователя в базу данных PostgreSQL и затем извлекает его. Используй SQLAlchemy и тестовую базу данных, создаваемую через testcontainers.

Пример результата:

import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from testcontainers.postgres import PostgresContainer
from app.models import User, Base

@pytest.fixture(scope="module")
def db_session():
    with PostgresContainer("postgres:15") as postgres:
        engine = create_engine(postgres.get_connection_url())
        Base.metadata.create_all(engine)
        Session = sessionmaker(bind=engine)
        yield Session()

def test_create_and_retrieve_user(db_session):
    user = User(name="Alice", email="alice@example.com")
    db_session.add(user)
    db_session.commit()

    retrieved = db_session.query(User).filter_by(email="alice@example.com").first()
    assert retrieved.name == "Alice"

3. Промт для тестирования API-эндпоинта

Задача: Написать тест для REST API на FastAPI.

Промт:

Создай интеграционный тест на pytest с использованием TestClient из FastAPI для эндпоинта POST /api/items. Тест должен проверить: успешное создание, возврат 201, валидацию тела запроса (пропущено обязательное поле), и ответ 422.

Пример результата:

import pytest
from fastapi.testclient import TestClient
from app.main import app

client = TestClient(app)

def test_create_item_success():
    response = client.post("/api/items", json={"name": "Laptop", "price": 1200})
    assert response.status_code == 201
    assert response.json()["name"] == "Laptop"

def test_create_item_missing_field():
    response = client.post("/api/items", json={"name": "Laptop"})
    assert response.status_code == 422

4. Промт для тестов на Jest (JavaScript)

Задача: Написать unit-тесты для функции валидации email.

Промт:

Напиши тесты на Jest для функции `validateEmail(email: string): boolean`, которая проверяет email по простому regex. Включи тесты для: валидного email, невалидного email, пустой строки, null.

Пример результата:

const validateEmail = require('./validateEmail');

test('valid email returns true', () => {
  expect(validateEmail('test@example.com')).toBe(true);
});

test('invalid email returns false', () => {
  expect(validateEmail('test@')).toBe(false);
});

test('empty string returns false', () => {
  expect(validateEmail('')).toBe(false);
});

test('null returns false', () => {
  expect(validateEmail(null)).toBe(false);
});

5. Промт для тестирования асинхронного кода

Задача: Проверить асинхронную функцию загрузки данных.

Промт:

Напиши асинхронный тест на pytest для функции `async fetch_data(url: str) -> dict`, которая использует aiohttp. Используй unittest.mock или pytest-asyncio для мока HTTP-запроса.

Пример результата:

import pytest
from unittest.mock import AsyncMock, patch
import aiohttp

@pytest.mark.asyncio
async def test_fetch_data_success():
    mock_response = AsyncMock()
    mock_response.json = AsyncMock(return_value={"key": "value"})
    mock_response.status = 200

    with patch("aiohttp.ClientSession.get", return_value=mock_response):
        result = await fetch_data("http://example.com")
        assert result == {"key": "value"}

6. Промт для тестирования с mock-объектами

Задача: Изолировать внешнюю зависимость.

Промт:

Напиши unit-тест на pytest с использованием mocker из pytest-mock для функции `send_email(user_email, message)`, которая вызывает внешний SMTP-сервер. Проверь, что функция вызвана с правильными аргументами.

Пример результата:

def test_send_email_calls_smtp(mocker):
    mock_smtp = mocker.patch('smtplib.SMTP')
    send_email('user@example.com', 'Hello')
    mock_smtp.assert_called_once()
    mock_smtp.return_value.sendmail.assert_called_once()

7. Промт для параметризованных тестов

Задача: Проверить функцию на множестве входных данных.

Промт:

Используй @pytest.mark.parametrize для тестирования функции `is_prime(n: int) -> bool`. Передай 10 тестовых случаев: простые числа, составные числа, 0, 1, отрицательные.

Пример результата:

import pytest

@pytest.mark.parametrize("n,expected", [
    (2, True),
    (3, True),
    (4, False),
    (0, False),
    (1, False),
    (-5, False),
    (17, True),
])
def test_is_prime(n, expected):
    assert is_prime(n) == expected

8. Промт для тестирования исключений

Задача: Проверить обработку ошибок.

Промт:

Напиши тест на pytest для функции `divide(a, b)`, который проверяет, что при b=0 выбрасывается ZeroDivisionError с сообщением "Division by zero is not allowed".

Пример результата:

def test_divide_by_zero():
    with pytest.raises(ZeroDivisionError, match="Division by zero is not allowed"):
        divide(10, 0)

9. Промт для интеграционного теста с внешним API

Задача: Проверить взаимодействие с сервисом погоды.

Промт:

Напиши интеграционный тест на pytest, который вызывает реальный API погоды (например, OpenWeatherMap) с корректным ключом. Используй фикстуру для настройки ключа из переменной окружения. Добавь пропуск теста, если ключа нет.

Пример результата:

import pytest
import os
import requests

@pytest.fixture
def api_key():
    key = os.getenv("OWM_API_KEY")
    if not key:
        pytest.skip("API key not set")
    return key

def test_get_weather(api_key):
    url = f"http://api.openweathermap.org/data/2.5/weather?q=London&appid={api_key}"
    response = requests.get(url)
    assert response.status_code == 200
    assert "weather" in response.json()

10. Промт для тестирования покрытия кода

Задача: Сгенерировать тесты для достижения 100% покрытия.

Промт:

Проанализируй следующий код и напиши тесты на pytest так, чтобы покрытие было 100%:

def process_order(order):
    if order["total"] > 100:
        return "free_shipping"
    elif order["total"] > 0:
        return "paid_shipping"
    else:
        return "invalid_order"

Пример результата:

import pytest

def test_free_shipping():
    assert process_order({"total": 150}) == "free_shipping"

def test_paid_shipping():
    assert process_order({"total": 50}) == "paid_shipping"

def test_invalid_order():
    assert process_order({"total": 0}) == "invalid_order"

Заключение

Эти 10 промтов покрывают 80% типовых задач в тестировании: от простых unit-тестов до сложных интеграционных сценариев. Главный совет: не копируйте промты слепо — адаптируйте их под свой проект. Например, для pytest используйте фикстуры для общих ресурсов, а для Jest — describe-блоки для группировки. Начните с малого: выберите одну функцию и сгенерируйте для неё тест. Как только освоитесь, переходите к интеграционным тестам. Помните: хороший тест — это не тот, который проходит, а тот, который ловит баги. Удачи в автоматизации!

← Все статьи

Комментарии

Читайте также

CKA + CKAD — Kubernetes Administrator & Developer: путь к двойной DevOps-сертификации с AI-обучением на Asibiont.com

23 июля 2026

Как забыть про зубрежку: Курс «Навыки обучения и работа с памятью» и наука интервальных повторений

23 июля 2026

Понимание экономики ИИ: как Vibe Coding меняет правила игры в 2026 году

23 июля 2026

Monday.com увольняет сотни сотрудников: ставка на ИИ как стратегия выживания

23 июля 2026

Как подключить микрофон MAX9814 или INMP441 к AI-агенту ASI Biont: голосовое управление и аудиоаналитика в реальном времени

23 июля 2026

Секрет успеха Kimi K3: эксперты опровергают слухи об эксплуатации Fable от Anthropic

23 июля 2026

Как интегрировать WooCommerce с AI-агентом ASI Biont: автоматизация заказов, инвентаря и поддержки клиентов за минуты

23 июля 2026

Как ИИ помогает ученым создавать лекарства следующего поколения: от молекулы до пациента

23 июля 2026

Как подключить HC-SR04 (ультразвуковой датчик) к AI-агенту ASI Biont: прогнозы, тренды и автоматизация измерений

23 июля 2026