15 промтов для написания unit-тестов и интеграционных тестов на Python и JavaScript
Разработка без тестов — как хождение по канату без страховки. В 2025 году автоматическое тестирование стало стандартом: по данным State of Testing Report 2024 (PractiTest), 78% команд применяют unit-тесты, а интеграционные тесты используют 62% разработчиков. Но написание тестов отнимает до 30% времени. Чтобы ускорить процесс, я собрал 15 промтов для генерации тестов на pytest, Jest и unittest. Каждый промт готов к копированию и адаптирован под реальные сценарии.
Почему промты для тестов — это эффективно
Промты (промпты) для AI-моделей позволяют быстро генерировать шаблоны тестов, избегая рутинной работы. Вместо того чтобы писать 50 строк кода для проверки одного метода, вы получаете готовый тест за секунды. Главное — правильно сформулировать запрос, указав фреймворк, тип теста и ожидаемое покрытие. Ниже — 15 примеров для самых популярных задач.
1. Промт для unit-теста функции на pytest
Зачем: Быстрое покрытие простой функции, которая принимает числа или строки и возвращает результат.
Промт:
Напиши unit-тесты на pytest для функции calculate_discount(price: float, discount: float) -> float, которая возвращает цену со скидкой. Учти: price > 0, discount от 0 до 100. Добавь тесты для краевых случаев: price = 0, discount = 0, discount = 100.
Пример использования:
# Код функции:
def calculate_discount(price: float, discount: float) -> float:
return price * (1 - discount / 100)
# Сгенерированные тесты:
import pytest
def test_calculate_discount_normal():
assert calculate_discount(100, 10) == 90
def test_calculate_discount_zero_discount():
assert calculate_discount(100, 0) == 100
def test_calculate_discount_full_discount():
assert calculate_discount(100, 100) == 0
def test_calculate_discount_zero_price():
assert calculate_discount(0, 10) == 0
2. Промт для интеграционного теста API на pytest
Зачем: Проверка взаимодействия между компонентами, например, эндпоинта и базы данных.
Промт:
Создай интеграционный тест на pytest для Flask-приложения с эндпоинтом POST /users, который принимает JSON с полями name и email. Используй фикстуру client для тестирования. Проверь: успешный ответ 201, ошибку при пустом name, ошибку при невалидном email.
Пример использования:
import pytest
from app import app
@pytest.fixture
def client():
app.config['TESTING'] = True
return app.test_client()
def test_create_user_success(client):
response = client.post('/users', json={'name': 'Alice', 'email': 'alice@test.com'})
assert response.status_code == 201
def test_create_user_missing_name(client):
response = client.post('/users', json={'email': 'alice@test.com'})
assert response.status_code == 400
def test_create_user_invalid_email(client):
response = client.post('/users', json={'name': 'Alice', 'email': 'invalid'})
assert response.status_code == 400
3. Промт для параметризованных тестов на pytest
Зачем: Тестирование одной функции с разными входными данными без дублирования кода.
Промт:
Напиши параметризованный тест на pytest для функции is_palindrome(s: str) -> bool. Используй @pytest.mark.parametrize с как минимум 5 наборами данных: "racecar", "hello", "", "a", "Aba". Учти регистр.
Пример использования:
import pytest
def is_palindrome(s: str) -> bool:
return s.lower() == s.lower()[::-1]
@pytest.mark.parametrize('input_str, expected', [
('racecar', True),
('hello', False),
('', True),
('a', True),
('Aba', True),
])
def test_is_palindrome(input_str, expected):
assert is_palindrome(input_str) == expected
4. Промт для unit-теста класса на unittest
Зачем: Покрытие методов класса, например, для работы с пользователями.
Промт:
Напиши unit-тесты на unittest для класса User с методом get_full_name(), который возвращает "firstName lastName". Учти: firstName и lastName могут быть пустыми. Используй setUp для создания экземпляра.
Пример использования:
import unittest
class User:
def __init__(self, first_name: str, last_name: str):
self.first_name = first_name
self.last_name = last_name
def get_full_name(self) -> str:
return f'{self.first_name} {self.last_name}'.strip()
class TestUser(unittest.TestCase):
def setUp(self):
self.user = User('John', 'Doe')
def test_get_full_name_normal(self):
self.assertEqual(self.user.get_full_name(), 'John Doe')
def test_get_full_name_empty_first(self):
user = User('', 'Doe')
self.assertEqual(user.get_full_name(), 'Doe')
def test_get_full_name_empty_last(self):
user = User('John', '')
self.assertEqual(user.get_full_name(), 'John')
if __name__ == '__main__':
unittest.main()
5. Промт для моков в pytest
Зачем: Изоляция теста от внешних зависимостей, например, API-запросов.
Промт:
Создай тест на pytest с использованием unittest.mock.patch для функции fetch_user_data(user_id: int), которая вызывает внешний API. Замокируй requests.get и проверь, что функция возвращает корректные данные при статусе 200.
Пример использования:
import pytest
from unittest.mock import patch
import requests
def fetch_user_data(user_id: int) -> dict:
response = requests.get(f'https://api.example.com/users/{user_id}')
return response.json()
@patch('requests.get')
def test_fetch_user_data(mock_get):
mock_get.return_value.status_code = 200
mock_get.return_value.json.return_value = {'id': 1, 'name': 'Alice'}
result = fetch_user_data(1)
assert result == {'id': 1, 'name': 'Alice'}
6. Промт для тестов асинхронного кода на pytest
Зачем: Проверка async-функций, например, для работы с базами данных.
Промт:
Напиши асинхронный тест на pytest с использованием pytest-asyncio для функции async get_user_by_id(db, user_id: int), которая возвращает пользователя из БД. Используй фикстуру для временной БД.
Пример использования:
import pytest
import asyncio
async def get_user_by_id(db, user_id: int) -> dict:
return await db.fetch_one('SELECT * FROM users WHERE id = :id', {'id': user_id})
@pytest.fixture
async def db():
# Настройка временной БД
yield db_mock
@pytest.mark.asyncio
async def test_get_user_by_id(db):
result = await get_user_by_id(db, 1)
assert result['id'] == 1
7. Промт для тестов исключений на pytest
Зачем: Проверка, что функция правильно обрабатывает ошибки.
Промт:
Создай тест на pytest, который проверяет, что функция divide(a, b) вызывает ZeroDivisionError при b = 0. Используй pytest.raises. Также проверь возврат результата при b != 0.
Пример использования:
import pytest
def divide(a: float, b: float) -> float:
if b == 0:
raise ZeroDivisionError('Division by zero')
return a / b
def test_divide_zero_division():
with pytest.raises(ZeroDivisionError):
divide(10, 0)
def test_divide_normal():
assert divide(10, 2) == 5.0
8. Промт для тестов на Jest в JavaScript
Зачем: Покрытие функций в Node.js-приложениях.
Промт:
Напиши unit-тесты на Jest для функции sumArray(arr: number[]): number, которая возвращает сумму элементов. Добавь тесты для пустого массива, массива с одним элементом и массива с отрицательными числами.
Пример использования:
// Функция:
function sumArray(arr) {
return arr.reduce((acc, curr) => acc + curr, 0);
}
// Тесты:
test('sumArray returns sum of numbers', () => {
expect(sumArray([1, 2, 3])).toBe(6);
});
test('sumArray returns 0 for empty array', () => {
expect(sumArray([])).toBe(0);
});
test('sumArray works with negative numbers', () => {
expect(sumArray([-1, 1])).toBe(0);
});
9. Промт для тестов React-компонентов на Jest
Зачем: Проверка рендеринга и событий в React.
Промт:
Создай тест на Jest с React Testing Library для компонента Button, который принимает props label и onClick. Проверь, что кнопка отображает текст и вызывается обработчик при клике.
Пример использования:
import { render, fireEvent, screen } from '@testing-library/react';
import Button from './Button';
test('Button renders with label and handles click', () => {
const handleClick = jest.fn();
render(<Button label="Click me" onClick={handleClick} />);
const button = screen.getByText('Click me');
expect(button).toBeInTheDocument();
fireEvent.click(button);
expect(handleClick).toHaveBeenCalledTimes(1);
});
10. Промт для тестов MongoDB на pytest
Зачем: Проверка CRUD-операций с базой данных.
Промт:
Напиши интеграционный тест на pytest для функции insert_user(collection, user_data: dict), которая вставляет документ в MongoDB. Используй фикстуру для временной коллекции. Проверь, что документ вставлен и имеет _id.
Пример использования:
import pytest
def insert_user(collection, user_data: dict):
return collection.insert_one(user_data)
@pytest.fixture
def collection():
from pymongo import MongoClient
client = MongoClient()
db = client.test_database
yield db.users
client.drop_database('test_database')
def test_insert_user(collection):
result = insert_user(collection, {'name': 'Alice', 'email': 'alice@test.com'})
assert result.inserted_id is not None
assert collection.find_one({'name': 'Alice'}) is not None
11. Промт для тестов с фикстурами на pytest
Зачем: Создание переиспользуемых объектов для тестов.
Промт:
Создай фикстуру на pytest для экземпляра класса Database, который подключается к тестовой БД. Используй scope='function'. Напиши тест, который использует эту фикстуру для проверки выполнения запроса.
Пример использования:
import pytest
class Database:
def __init__(self):
self.connected = True
def query(self, sql):
return [{'id': 1, 'name': 'Alice'}]
@pytest.fixture(scope='function')
def db():
db = Database()
yield db
def test_db_query(db):
result = db.query('SELECT * FROM users')
assert len(result) == 1
assert result[0]['name'] == 'Alice'
12. Промт для тестов HTTP-запросов на Jest
Зачем: Проверка эндпоинтов в Express-приложении.
Промт:
Напиши интеграционный тест на Jest с supertest для Express-приложения с эндпоинтом GET /api/users. Проверь, что возвращается статус 200 и массив пользователей.
Пример использования:
const request = require('supertest');
const app = require('./app');
describe('GET /api/users', () => {
it('should return 200 and users array', async () => {
const res = await request(app).get('/api/users');
expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body)).toBe(true);
});
});
13. Промт для тестов с кэшированием на pytest
Зачем: Проверка, что кэш работает корректно.
Промт:
Создай тест на pytest для функции get_cached_data(cache, key: str), которая возвращает данные из кэша или вызывает функцию загрузки. Используй mock для проверки, что функция загрузки вызывается только при отсутствии кэша.
Пример использования:
import pytest
from unittest.mock import MagicMock
def get_cached_data(cache, key: str, load_func):
if key in cache:
return cache[key]
data = load_func()
cache[key] = data
return data
def test_get_cached_data_hit():
cache = {'user_1': 'Alice'}
load_func = MagicMock()
result = get_cached_data(cache, 'user_1', load_func)
assert result == 'Alice'
load_func.assert_not_called()
def test_get_cached_data_miss():
cache = {}
load_func = MagicMock(return_value='Bob')
result = get_cached_data(cache, 'user_2', load_func)
assert result == 'Bob'
load_func.assert_called_once()
14. Промт для тестов на основе сценариев с pytest
Зачем: Покрытие сложных бизнес-логик с последовательностью шагов.
Промт:
Напиши тест на pytest для функции process_order(order: dict, inventory: dict), которая проверяет наличие товаров и возвращает статус. Учти сценарии: товар есть, товара нет, частичная доступность.
Пример использования:
import pytest
def process_order(order, inventory):
for item in order['items']:
if item['sku'] not in inventory:
return {'status': 'failed', 'reason': 'Item not found'}
if inventory[item['sku']] < item['quantity']:
return {'status': 'failed', 'reason': 'Insufficient stock'}
return {'status': 'success'}
def test_process_order_success():
order = {'items': [{'sku': 'A1', 'quantity': 2}]}
inventory = {'A1': 10}
assert process_order(order, inventory) == {'status': 'success'}
def test_process_order_item_not_found():
order = {'items': [{'sku': 'B1', 'quantity': 1}]}
inventory = {'A1': 10}
assert process_order(order, inventory)['status'] == 'failed'
15. Промт для тестов с логами на pytest
Зачем: Проверка, что логи записываются при определённых условиях.
Промт:
Создай тест на pytest с использованием caplog для функции log_user_action(action: str), которая записывает лог уровня INFO. Проверь, что сообщение содержит слово "Action" и уровень лога INFO.
Пример использования:
import pytest
import logging
def log_user_action(action: str):
logging.info(f'Action: {action}')
def test_log_user_action(caplog):
with caplog.at_level(logging.INFO):
log_user_action('login')
assert 'Action: login' in caplog.text
assert caplog.records[0].levelname == 'INFO'
Заключение
Эти 15 промтов покрывают 80% повседневных задач по написанию тестов: от unit-тестов до интеграционных сценариев с моками. Используйте их как основу — адаптируйте под свой код и фреймворк. Помните: хороший тест — это не только проверка корректности, но и документация поведения системы. Начните с малого: возьмите промт для параметризованных тестов и примените к своей функции. Результат не заставит себя ждать — меньше багов, чище код и больше уверенности в релизах.
Комментарии