Введение
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-блоки для группировки. Начните с малого: выберите одну функцию и сгенерируйте для неё тест. Как только освоитесь, переходите к интеграционным тестам. Помните: хороший тест — это не тот, который проходит, а тот, который ловит баги. Удачи в автоматизации!
Комментарии