Test writer
Написание тестов для Python-бэкенда (pytest-first): стратегия покрытия критического пути, дизайн кейсов (границы, ошибки, идемпотентность), фикстуры и параметризация, фабрики (factory_boy), паттерны Django (pytest-django, client, БД-маркеры), FastAPI (httpx AsyncClient, dependency_overrides) и aiogram 3.x (моки Bot, тесты хендлеров). Используй когда пользователь просит написать тесты, покрыть код/фичу/модуль тестами, добавить регрессионный тест на баг, настроить pytest/фикстуры/фабрики, или говорит «напиши тесты», «покрой тестами», «нужен тест на». Аудит качества уже существующих тестов — см. test-coverage-auditor.From its SKILL.md
npx -y skills add goldenprofile/llm-skills --skill test-writerAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
8.0 KB, ~1.9k tokens by cl100k_base, as published. Nobody here has run it
Test Writer
Пишет тесты, которые ловят реальные регрессии, а не накручивают coverage. Профиль: pytest, Python-бэкенд (Django / FastAPI / aiogram 3.x).
Когда применять
- Покрыть тестами новую фичу, модуль или найденный баг (регрессионный тест).
- Добавить characterization-тесты перед рефакторингом legacy-кода.
- Настроить тестовую инфраструктуру: conftest, фикстуры, фабрики, маркеры.
Контекст — установить ПЕРВЫМ делом
- Раннер и конвенции —
pyproject.toml([tool.pytest.ini_options]),pytest.ini, существующиеconftest.py, стиль текущих тестов (naming, классы vs функции, где живут фикстуры). Новые тесты обязаны следовать существующим конвенциям, а не вводить свои. - Стек — Django (
pytest-django?), FastAPI, aiogram, чистый Python. - Где запускаются тесты — локально или только в CI. Если локальной БД нет (типовой сетап владельца: dev-машина без сервисов) — пиши тесты так, чтобы они шли в CI; локально прогоняй только не требующие БД. Не выдумывай локальный запуск, которого нет.
- Что критично — спроси или определи по коду: деньги, авторизация, внешние интеграции, данные пользователей. Это покрывается первым.
Принципы
- Тестируй поведение, не реализацию. Тест переживает рефакторинг, если проверяет контракт (вход → выход/эффект), а не внутренние вызовы.
- Критический путь → границы → ошибки. Happy path одного сценария — один тест; затем граничные значения; затем ветки ошибок (невалидный ввод, отказ внешней системы, пустые данные).
- Не мокай то, что можно вызвать. Мок — для внешних границ (HTTP, Telegram API, время, случайность), не для соседнего модуля.
- Каждый мок проверяется (
assert_called_once_with(...)) или не нужен. - Тесты независимы: без порядка выполнения и общего мутируемого состояния.
- Имя = сценарий:
test_refund_rejected_when_order_already_shipped, а неtest_refund_2.
Процесс
- Изучи код и существующие тесты затрагиваемой области (Read/Grep).
- Составь план кейсов и покажи пользователю таблицей: сценарий → тип (happy/edge/error) → приоритет. Для регрессионного теста на баг — сначала тест, воспроизводящий баг (красный), потом фикс.
- Напиши тесты по конвенциям проекта: фикстуры вместо дублирования setup,
@pytest.mark.parametrizeдля однотипных кейсов, фабрики вместо ручных словарей данных. - Прогони: локально то, что можно; остальное — отметь «проверяется в CI» и убедись, что CI-конфиг эти тесты подхватит.
- Самопроверка по чеклисту ниже.
Паттерны по стекам
Django (pytest-django):
@pytest.mark.django_dbтолько там, где реально нужна БД; бизнес-логику по возможности тестируй без БД.client/admin_clientфикстуры для view-тестов; проверяй статус, редирект и эффект в БД, а не HTML построчно.- factory_boy:
class OrderFactory(DjangoModelFactory)вместо фикстур-джейсонов;SubFactoryдля связей,factory.Fakerдля полей. - Сигналы/задачи Celery: вызывай task-функцию напрямую (
task.run(...)илиapply()), сам брокер не нужен.
FastAPI:
httpx.AsyncClient(transport=ASGITransport(app=app), base_url="http://test")pytest.mark.anyio— для async-роутов.
app.dependency_overrides[get_db] = get_test_db— подмена зависимостей; сбрасывай оверрайды в фикстуре (teardown).- Валидацию схем тестируй через эндпоинт (422 на невалидный ввод), а не инстанцированием модели.
aiogram 3.x:
- Хендлеры — обычные async-функции: вызывай напрямую с мок-
Message/CallbackQuery(AsyncMock(spec=Message)), проверяйmessage.answer.assert_called_once_with(...). - FSM:
FSMContextсMemoryStorageв тесте; проверяй переходы состояний. - Не поднимай реального бота и polling в тестах.
Чеклист качества (перед сдачей)
- Каждый тест содержит assertion по существу (не только «не упало»).
- Каждый мок либо проверен, либо удалён.
- Границы и ошибки покрыты, не только happy path.
- Тесты проходят из любого порядка запуска (
pytest -p no:randomlyне нужен). - Имена читаются как спецификация поведения.
- Новые фикстуры/фабрики — в conftest/factories по конвенции проекта.
Связь с библиотекой навыков
test-coverage-auditor— аудит качества написанного: прогони после крупной партии тестов.goal-pipeline— вызывает этот навык в фазах с deliverable «тесты»; safety-net фаза перед рефакторингом — это characterization-тесты отсюда.fastapi-architect/aiogram-bot-auditor— архитектурные вопросы стека, влияющие на тестируемость (DI, разделение логики и I/O).
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most docs writing skills give in ~1.9k tokens
Counted across 1,637 of the 3,044 authors here whose files we hold, read 2026-08-07
- Announce the skill at startin 54 of 1637, across 26 files
- Convert legacy doc files before editingin 45 of 1637, across 7 files
- Predict questions readers might askin 42 of 1637, across 4 files
- Generate clarifying questions for initial contextin 42 of 1637, across 3 files
- Create document scaffold with placeholder textin 42 of 1637, across 3 files
- Brainstorm content options for each sectionin 42 of 1637, across 3 files
- Test the document with a fresh context-less instancein 42 of 1637, across 3 files
- Include exact file paths in every taskin 42 of 1637, across 15 files
- Ask interview questions one at a timein 42 of 1637, across 27 files
- Apply surgical edits during refinementin 41 of 1637, across 2 files
- Offer structured workflow or freeformin 40 of 1637, across 1 file
- Ask for document meta-contextin 40 of 1637, across 2 files
Said here and by no other author read
- Cover the critical path before boundaries and errors
- Test behavior and contracts instead of implementation
- Do not mock internal modules
- Verify or delete every mock
- Show a test case plan before writing tests
- Use parametrize for similar test cases
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.