Тестовые задания Python Junior — это, как правило, небольшое приложение с API или скрипт для обработки данных. Разбираем реальный кейс: что дают, как подходить и на что обращают внимание.
Тестовое задание junior разработчика: как не завалить
Типичные форматы тестовых заданий Python Junior
REST API на FastAPI или Django:
Написать API для управления задачами/пользователями/заказами. CRUD-операции, база данных (PostgreSQL или SQLite), базовая аутентификация.
Скрипт парсинга или обработки данных:
Собрать данные из открытого API или HTML-страницы, обработать, сохранить в CSV/БД.
CLI-утилита:
Программа с аргументами командной строки: «сделай утилиту для конвертации форматов» или «CLI для работы с файлами».
Задача на алгоритмы:
Реже, но встречается: реализовать структуру данных или алгоритм с нуля.
Разбор кейса: REST API для управления задачами
Условие задания (типичное):
> Реализуй REST API для To-Do приложения. Требования:
> - CRUD для задач: создать, прочитать все/одну, обновить, удалить
> - Поля задачи: title, description, status (todo/in_progress/done), created_at
> - Хранение в базе данных
> - Документация API (Swagger)
Стек: Python 3.11+, FastAPI, SQLAlchemy, SQLite (или PostgreSQL).
Структура проекта
```
todo-api/
├── app/
│ ├── __init__.py
│ ├── main.py # точка входа
│ ├── models.py # SQLAlchemy модели
│ ├── schemas.py # Pydantic схемы
│ ├── crud.py # бизнес-логика
│ ├── database.py # подключение к БД
│ └── routers/
│ └── tasks.py # эндпоинты
├── tests/
│ └── test_tasks.py
├── .env
├── .gitignore
├── requirements.txt
└── README.md
```
Ключевые моменты реализации
Используйте Pydantic схемы для валидации входных данных — не принимайте сырые словари из запроса.
Разделяйте бизнес-логику и роуты. В `crud.py` — функции работы с БД, в `routers/tasks.py` — HTTP-логика (коды ответа, заголовки).
Обрабатывайте ошибки. Задача не найдена → 404, не 500. Используйте `HTTPException`.
Документация бесплатна. FastAPI генерирует Swagger из вашего кода. Добавьте описания к эндпоинтам через параметры декоратора.
Тесты
```python
# tests/test_tasks.py
def test_create_task(client):
response = client.post("/tasks/", json={"title": "Test", "description": ""})
assert response.status_code == 201
assert response.json()["title"] == "Test"
def test_get_nonexistent_task(client):
response = client.get("/tasks/9999")
assert response.status_code == 404
```
README — минимум
```markdown
## To-Do API
REST API для управления задачами.
Запуск
pip install -r requirements.txt
uvicorn app.main:app --reload
Документация http://localhost:8000/docs
Тесты pytest ```
Что смотрят в коде
Структура: нет ли всего в одном файле `main.py` на 500 строк.
Типизация: используете ли `type hints`. Это признак современного Python-кода.
Именование: понятные имена переменных и функций. `get_task_by_id` лучше, чем `get_t`.
Зависимости: `requirements.txt` с закреплёнными версиями, не `fastapi>=0.100`.
Безопасность: `.env` в `.gitignore`, `SECRET_KEY` не захардкожен.
FAQ
Нужно ли Docker для тестового задания?
Не обязательно, но `docker-compose.yml` — большой плюс. Показывает понимание инфраструктуры.
SQLite или PostgreSQL?
Если в задании не указано — SQLite для простоты запуска. Или сделайте переключаемым через `.env`.
Нужна ли аутентификация, если не требовали?
Можно добавить как «бонус», упомянув в README. Не делайте сложную аутентификацию в ущерб основному заданию.
---