Стек: Python, небольшой бэкенд‑сервис.
Кусок кода (специально с проблемами)
import datetime
def get_user_active_days(logins):
# logins – список дат в виде строк 'YYYY-MM-DD'
# функция должна вернуть количество дней, когда пользователь заходил в систему за последние 30 дней
today = datetime.datetime.now()
count = 0
for login in logins:
login_date = datetime.datetime.strptime(login, "%Y-%m-%d")
diff = today – login_date
if diff.days <= 30:
count += 1
return count
Проблемы (подсказки):
включение текущего дня/границ,
часовые пояса/время,
привязка к now() внутри функции (сложно тестировать),
нет обработки некорректных форматов дат,
тип datetime, хотя логика по дням.
Баг‑репорт (условный)
Заголовок: Некорректный подсчёт активных дней пользователя
Описание:
В отчёте "Активность пользователей" для некоторых пользователей показывается больше активных дней, чем было фактически.
Ожидание:
Если пользователь заходил, например, 1 и 31 числа прошлого месяца, а сегодня 31-е текущего месяца, то активных дней за последние 30 дней должно быть 1, а не 2.
Фактическое поведение:
В текущей версии отчёта для такого пользователя показывается 2 активных дня.
Дополнительно:
Подозреваем, что проблема в функции get_user_active_days.
Условные логи инцидента
2024-11-30 02:05:10 [INFO] Generating activity report for user_id=123
2024-11-30 02:05:11 [DEBUG] User 123 logins: ['2024-10-31', '2024-11-01', '2024-11-15', '2024-11-30']
2024-11-30 02:05:11 [DEBUG] Active days count: 4
2024-11-30 02:05:11 [INFO] Report generated
Комментарий аналитика:
Для периода "последние 30 дней" (с 2024-10-31 по 2024-11-30 включительно) фактически пользователь заходил 3 дня: 1, 15 и 30 ноября. Логин от 2024-10-31 попадает в отчёт, но по бизнес-правилам его нужно исключать.
Задачи тренажёра “Разработчик”
Составить промт для код‑ревью функции get_user_active_days.
Составить промт для генерации тестов к этой функции.
Составить промт для разбора инцидента/логов и предложения фикса.
1. Эталон: промт для код‑ревью
Вы – сеньор Python-разработчик.
Контекст:
У нас есть функция, которая должна считать количество дней, когда пользователь заходил в систему за последние 30 дней. Есть подозрение, что она работает некорректно на границах периода.
Вот код:
```python
import datetime
def get_user_active_days(logins):
# logins – список дат в виде строк 'YYYY-MM-DD'
# функция должна вернуть количество дней, когда пользователь заходил в систему за последние 30 дней
today = datetime.datetime.now()
count = 0
for login in logins:
login_date = datetime.datetime.strptime(login, "%Y-%m-%d")
diff = today – login_date
if diff.days <= 30:
count += 1
return count
Задача:
Провести код‑ревью и найти потенциальные проблемы:
граничные случаи (ровно 30 дней, 31 день и т.п.),
привязка ко времени/часовым поясам,
тестируемость кода,
обработка некорректных данных.
Предложить улучшенную версию функции, учитывая:
чёткую бизнес-логику: “последние 30 полных дней, не включая текущий день” (или предложить варианты),
возможность передать "текущую дату" параметром для удобства тестирования,
аккуратность в работе с датами.
Формат ответа – только валидный JSON:
{ "summary": "Краткое общее впечатление от кода", "issues": [ { "type": "bug | edge_case | testability | style | other", "severity": "low | medium | high", "description": "Описание проблемы", "suggestion": "Предложение по исправлению" } ], "improved_code": "Улучшенная версия функции get_user_active_days", "notes": "Дополнительные комментарии, если есть" }
2. Эталон: промт для генерации тестов
```text
Вы – сеньор Python-разработчик и QA-инженер.
У нас есть функция get_user_active_days, которая должна возвращать количество активных дней пользователя за последние 30 дней. (Смотри код ниже.)
Код функции:
```python
import datetime
def get_user_active_days(logins):
# logins – список дат в виде строк 'YYYY-MM-DD'
# функция должна вернуть количество дней, когда пользователь заходил в систему за последние 30 дней
today = datetime.datetime.now()
count = 0
for login in logins:
login_date = datetime.datetime.strptime(login, "%Y-%m-%d")
diff = today – login_date
if diff.days <= 30:
count += 1
return count
Задача:
Предложить набор тест‑кейсов:
нормальные случаи,
граничные случаи (ровно 30 дней, 31 день, пустой список),
некорректные данные (невалидный формат даты).
Для каждого кейса указать:
описание,
пример входа (список дат),
заранее зафиксированную "текущую дату" (например, 2024-11-30),
ожидаемый результат.
Сгенерировать пример кода юнит-тестов с использованием pytest:
с фиксацией "текущей даты" (через monkeypatch или параметр в функции – можно предложить модификацию функции для лучшей тестируемости).
Формат ответа – только валидный JSON:
{ "test_cases": [ { "id": "case_1", "type": "normal | edge | invalid", "description": "Что проверяем", "today": "2024-11-30", "logins": ["2024-11-01", "2024-11-15"], "expected_result": 2 } ], "pytest_code_example": "Пример кода с тестами для pytest" }
3. Эталон: промт для разбора инцидента/логов
```text
Вы – сеньор Python-разработчик / SRE.
Контекст:
В отчёте "Активность пользователей" для некоторых пользователей показывается больше активных дней, чем было фактически. Подозреваем, что проблема в функции get_user_active_days.
Код функции:
```python
import datetime
def get_user_active_days(logins):
# logins – список дат в виде строк 'YYYY-MM-DD'
# функция должна вернуть количество дней, когда пользователь заходил в систему за последние 30 дней
today = datetime.datetime.now()
count = 0
for login in logins:
login_date = datetime.datetime.strptime(login, "%Y-%m-%d")
diff = today – login_date
if diff.days <= 30:
count += 1
return count
Логи инцидента: """ 2024-11-30 02:05:10 [INFO] Generating activity report for user_id=123 2024-11-30 02:05:11 [DEBUG] User 123 logins: ['2024-10-31', '2024-11-01', '2024-11-15', '2024-11-30'] 2024-11-30 02:05:11 [DEBUG] Active days count: 4 2024-11-30 02:05:11 [INFO] Report generated
Комментарий аналитика: Для периода "последние 30 дней" (с 2024-10-31 по 2024-11-30 включительно) фактически пользователь заходил 3 дня: 1, 15 и 30 ноября. Логин от 2024-10-31 попадает в отчёт, но по бизнес-правилам его нужно исключать. """
Задача:
На основе кода и логов:
сформулировать гипотезу причины некорректного подсчёта,
описать, как именно текущая логика даты/разницы дней даёт ошибку.
Предложить исправление бизнес‑логики:
чётко определить, что значит "последние 30 дней" (включая/исключая текущий день, границы периода),
описать, как скорректировать условие в коде.
Предложить дополнительные проверки/алерты или тесты, которые помогут в будущем не пропускать подобные ошибки.
Формат ответа – только валидный JSON:
{ "summary": "Краткое описание проблемы", "root_cause_hypothesis": "Гипотеза причины", "business_logic_fix": { "period_definition": "Как именно определяем период 'последние 30 дней'", "code_change_description": "Что нужно изменить в логике" }, "suggested_tests_or_alerts": [ "Идея теста или алерта 1", "Идея теста или алерта 2" ] }
Дальше можно:
– взять эти входные данные,
– написать свои версии промтов,
– сравнить с эталоном,
– улучшить под свой стиль и задачи,
– добавить в свою библиотеку промтов как готовые тренажёры.