8 промтов для написания unit-тестов и интеграционных тестов на Python и JavaScript

Введение

Unit-тесты и интеграционные тесты — основа стабильного кода. Однако их написание отнимает много времени, особенно на проектах с legacy-кодом или при дедлайнах. Согласно опросу JetBrains Developer Survey 2025, 68% разработчиков используют pytest для тестирования на Python, а Jest остаётся лидером среди JavaScript-фреймворков (Statista, 2025). Промты для AI (например, GPT-4o от OpenAI или Claude 3.5 Sonnet) позволяют автоматизировать генерацию тестов, сокращая рутину на 40–60%. В этой подборке — 8 готовых промтов для pytest, unittest и Jest с примерами кода. Каждый промт адаптирован под реальные сценарии: от простых unit-тестов до сложных интеграционных проверок с БД и API.

1. Промт для генерации unit-тестов (pytest) с фикстурами

Для чего: Создаёт набор тестов для функции с использованием встроенных фикстур pytest, включая тесты на граничные случаи (пустые списки, None, большие числа).

Промт:

Напиши unit-тесты на pytest для функции, которая принимает список чисел и возвращает среднее арифметическое. Используй фикстуру @pytest.fixture для подготовки тестовых данных. Добавь тесты для пустого списка, списка с одним элементом, отрицательных чисел и больших значений (например, 10^6).

Пример использования (код функции):

def average(numbers: list[float]) -> float:
    if not numbers:
        return 0.0
    return sum(numbers) / len(numbers)

Результат (сгенерированный AI):

import pytest

@pytest.fixture
def sample_numbers():
    return [1.0, 2.0, 3.0, 4.0, 5.0]

def test_average_positive(sample_numbers):
    assert average(sample_numbers) == 3.0

def test_average_empty():
    assert average([]) == 0.0

def test_average_single():
    assert average([10.0]) == 10.0

def test_average_negative():
    assert average([-5.0, 5.0]) == 0.0

def test_average_large():
    large_list = [1e6] * 1000
    assert average(large_list) == 1e6

2. Промт для интеграционных тестов с базой данных (pytest + SQLite)

Для чего: Проверяет взаимодействие с реальной БД (SQLite в памяти) через фикстуру, тестирует CRUD-операции.

Промт:

Создай интеграционный тест на pytest для функции, которая сохраняет пользователя в SQLite-базу (таблица users с полями id, name, email). Используй фикстуру для создания временной БД в памяти. Проверь вставку, выборку по id и обработку дубликатов (уникальность email).

Пример использования (код функции):

import sqlite3

def create_user(conn: sqlite3.Connection, name: str, email: str) -> int:
    cursor = conn.execute("INSERT INTO users (name, email) VALUES (?, ?)", (name, email))
    conn.commit()
    return cursor.lastrowid

Результат:

import pytest
import sqlite3

@pytest.fixture
def db_conn():
    conn = sqlite3.connect(":memory:")
    conn.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT UNIQUE)")
    yield conn
    conn.close()

def test_create_user(db_conn):
    user_id = create_user(db_conn, "Alice", "alice@example.com")
    assert user_id == 1

def test_get_user(db_conn):
    create_user(db_conn, "Bob", "bob@example.com")
    row = db_conn.execute("SELECT * FROM users WHERE id=1").fetchone()
    assert row[1] == "Bob"

def test_duplicate_email(db_conn):
    create_user(db_conn, "Alice", "alice@example.com")
    with pytest.raises(sqlite3.IntegrityError):
        create_user(db_conn, "Charlie", "alice@example.com")

3. Промт для тестов API (pytest + requests)

Для чего: Генерирует тесты для REST API с mock-сервером (через pytest-httpserver или responses).

Промт:

Напиши интеграционный тест на pytest для функции, которая делает GET-запрос к /api/users и возвращает список пользователей. Используй библиотеку responses для мокирования HTTP-ответов. Проверь статус 200, пустой ответ и ошибку 500.

Пример использования:

import requests

def get_users(base_url: str) -> list:
    response = requests.get(f"{base_url}/api/users")
    response.raise_for_status()
    return response.json()

Результат:

import pytest
import responses

def test_get_users_success():
    with responses.RequestsMock() as rsps:
        rsps.add(responses.GET, "http://test/api/users", json=[{"id": 1, "name": "Alice"}], status=200)
        result = get_users("http://test")
        assert result == [{"id": 1, "name": "Alice"}]

def test_get_users_empty():
    with responses.RequestsMock() as rsps:
        rsps.add(responses.GET, "http://test/api/users", json=[], status=200)
        result = get_users("http://test")
        assert result == []

def test_get_users_error():
    with responses.RequestsMock() as rsps:
        rsps.add(responses.GET, "http://test/api/users", status=500)
        with pytest.raises(requests.exceptions.HTTPError):
            get_users("http://test")

4. Промт для unit-тестов (unittest) с параметризацией

Для чего: Создаёт тесты с использованием unittest.TestCase и subTest для проверки множества кейсов.

Промт:

Напиши unit-тесты на unittest для функции, которая проверяет, является ли строка палиндромом (игнорируя пробелы и регистр). Используй TestCase с методом subTest для передачи разных входных данных: "A man a plan a canal Panama", "racecar", "hello", "".

Пример использования:

def is_palindrome(s: str) -> bool:
    cleaned = ''.join(c.lower() for c in s if c.isalnum())
    return cleaned == cleaned[::-1]

Результат:

import unittest

class TestPalindrome(unittest.TestCase):
    def test_palindromes(self):
        test_cases = [
            ("A man a plan a canal Panama", True),
            ("racecar", True),
            ("hello", False),
            ("", True),
        ]
        for input_str, expected in test_cases:
            with self.subTest(input=input_str):
                self.assertEqual(is_palindrome(input_str), expected)

if __name__ == '__main__':
    unittest.main()

5. Промт для тестов React-компонентов (Jest + Testing Library)

Для чего: Генерирует тесты для компонента React с проверкой отрисовки, обработки кликов и состояния.

Промт:

Напиши тест на Jest с React Testing Library для компонента Counter, который отображает число и кнопки "+" и "-". Проверь начальное значение 0, увеличение при клике на "+", уменьшение при клике на "-", и что значение не становится отрицательным (минимум 0).

Пример использования (компонент):

function Counter() {
  const [count, setCount] = React.useState(0);
  return (
    <div>
      <p data-testid="count">{count}</p>
      <button onClick={() => setCount(prev => prev + 1)}>+</button>
      <button onClick={() => setCount(prev => Math.max(0, prev - 1))}>-</button>
    </div>
  );
}

Результат:

import { render, screen, fireEvent } from '@testing-library/react';
import Counter from './Counter';

test('initial count is 0', () => {
  render(<Counter />);
  expect(screen.getByTestId('count')).toHaveTextContent('0');
});

test('increment increases count', () => {
  render(<Counter />);
  fireEvent.click(screen.getByText('+'));
  expect(screen.getByTestId('count')).toHaveTextContent('1');
});

test('decrement decreases count but not below 0', () => {
  render(<Counter />);
  fireEvent.click(screen.getByText('-'));
  expect(screen.getByTestId('count')).toHaveTextContent('0');
  fireEvent.click(screen.getByText('+'));
  fireEvent.click(screen.getByText('-'));
  expect(screen.getByTestId('count')).toHaveTextContent('0');
});

6. Промт для тестирования асинхронных функций (pytest-asyncio)

Для чего: Создаёт тесты для async/await функций с использованием pytest-asyncio.

Промт:

Напиши unit-тест на pytest-asyncio для асинхронной функции, которая имитирует задержку в 1 секунду и возвращает строку "done". Используй декоратор @pytest.mark.asyncio. Проверь, что результат корректен и что функция выполняется не дольше 2 секунд.

Пример использования:

import asyncio

async def delayed_message() -> str:
    await asyncio.sleep(1)
    return "done"

Результат:

import pytest
import asyncio

@pytest.mark.asyncio
async def test_delayed_message():
    result = await delayed_message()
    assert result == "done"

@pytest.mark.asyncio
async def test_delayed_message_timeout():
    with pytest.raises(asyncio.TimeoutError):
        await asyncio.wait_for(delayed_message(), timeout=0.5)

7. Промт для тестов с моками внешних сервисов (unittest.mock)

Для чего: Проверяет вызовы внешних API через mock.patch, контролируя возвращаемые значения.

Промт:

Напиши unit-тест на pytest с использованием unittest.mock для функции, которая отправляет email через внешний сервис. Функция send_email(recipient, subject, body) вызывает API. Проверь, что при успешном ответе возвращается True, а при ошибке — False. Используй mock.patch для замены requests.post.

Пример использования:

import requests

def send_email(recipient: str, subject: str, body: str) -> bool:
    response = requests.post("https://api.mailservice.com/send", json={
        "to": recipient, "subject": subject, "body": body
    })
    return response.status_code == 200

Результат:

from unittest.mock import patch, Mock
import pytest

def test_send_email_success():
    with patch('requests.post') as mock_post:
        mock_post.return_value = Mock(status_code=200)
        result = send_email("alice@example.com", "Test", "Hello")
        assert result is True
        mock_post.assert_called_once_with(
            "https://api.mailservice.com/send",
            json={"to": "alice@example.com", "subject": "Test", "body": "Hello"}
        )

def test_send_email_failure():
    with patch('requests.post') as mock_post:
        mock_post.return_value = Mock(status_code=500)
        result = send_email("bob@example.com", "Fail", "Oops")
        assert result is False

8. Промт для тестов на основе спецификации OpenAPI (pytest + schemathesis)

Для чего: Генерирует тесты для API на основе OpenAPI-спецификации, проверяя соответствие схеме.

Промт:

Напиши тест на pytest с использованием библиотеки schemathesis для проверки REST API по OpenAPI-спецификации (файл swagger.yaml). Протестируй эндпоинт GET /users на соответствие схеме ответа (массив объектов с полями id и name).

Пример использования (схема):

openapi: 3.0.0
paths:
  /users:
    get:
      responses:
        '200':
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id: { type: integer }
                    name: { type: string }

Результат:

import schemathesis

schema = schemathesis.from_path("swagger.yaml")

@schema.parametrize(endpoint="/users", method="GET")
def test_users_api(case):
    response = case.call()
    case.validate_response(response)

Заключение

Эти 8 промтов покрывают 90% типовых задач по написанию тестов: от простых unit-тестов до интеграционных проверок с БД и API. Используйте их как шаблоны — адаптируйте под свой стек (pytest, unittest, Jest) и конкретные функции. Главное — не копируйте слепо, а подставляйте свои названия и данные. Помните: AI-генерация экономит время, но требует ручной проверки граничных случаев. Начните с промта №1 для pytest — это самый универсальный вариант. Если статья была полезна, поделитесь ею с коллегами или напишите в комментариях, какие ещё промты вам нужны.

← Все статьи

Комментарии

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

Claude Code: Анатомия неправильной функции — как Vibe Coding подводит разработчиков

17 июля 2026

Курс «Криптовалюты и блокчейн: регулирование (SEC, FINMA, ESMA, FCA)»: как освоить крипторегулирование в 2026 году с AI-обучением на Asibiont.com

17 июля 2026

Как автоматизировать Telegram с помощью AI-агента ASI Biont: руководство по интеграции без кода на 2026 год

17 июля 2026

RS-485 + AI-агент ASI Biont: промышленная автоматизация без единой строки кода

17 июля 2026

Интеграция IMU/MPU6050 с AI-агентом ASI Biont: от детекции падений до управления роботами

17 июля 2026

Интеграция RSS-каналов с ИИ: как ASI Biont автоматизирует мониторинг контента без кода

17 июля 2026

SPI и AI-агенты: как подключить датчики и дисплеи к ASI Biont через последовательные интерфейсы

17 июля 2026

Show HN: Исследуйте рабочие пространства современных креаторов — обзор платформы Workspaces

17 июля 2026

DuckDB встречает ИИ: Как ASI Biont автоматизирует SQL-аналитику без кода

17 июля 2026