В этом репозитории представлено решение тестового задания на стажировку Авито "PR Reviewer Assignment Service". Выполнены все обязательные требования.
Язык программирования:
Golang
Фреймворки и библиотеки:
- Gin — веб-фреймворк для создания HTTP-сервисов
- Swagger — генерация и документация REST API
- testify — библиотека для написания тестов и утверждений (assertions)
- golangci — комплексный линтер для проверки качества кода
- migrate — управление миграциями базы данных
Базы данных и контейнеры:
- PostgreSQL — реляционная база данных
- Docker — контейнеризация приложений и служб
Для удобства проверки создана swagger документация по адресу /swagger/index.html.
Формат айди в проекте используется uuid, но для удобства проверки реализовано преобразование айди, переданных не в формате uuid, в uuid5. Этот алгоритм является детерминированным, поэтому проверяющий может использовать одни и те же несложные айди по типу u1, u2, pr-1001.
Из дополнительных заданий выполнены:
- Ручка
/stats, которая предоставляет статистику по сервису, включая общее количество пользователей, команд, PR, количество слитых и открытых PR, а также топ 10 ревьюверов по количеству назначений - Реализованы e2e тесты
- Проведено нагрузочное тестирование, результаты описаны ниже
- Используется golangci-lint с описанной конфигурацией
ВАЖНО Перед запуском создать файл .env в корне репозитория на подобии файла .env.example
Стандратные значения переменных среды указаны в .env.example
git clone https://github.com/gbbelskij/PRAssignment
cd PRAssignment
cp .env.example .env # скопировать пример переменных сред окружения со стандартными значениями
docker-compose upSwagger документация будет доступна по адресу http://127.0.0.1:8080/swagger/index.html
E2e тесты проверяют все пути взаимодействия с сервисом, для них при запуске тестов поднимается чистая бд в отдельном контейнере
Запуск тестов из корня репозитория
go test ./tests -vИнструмент: k6
Нагрузка: до 50 VU за 1 минуту
Были протестированы ручки
- /team/add
- /team/get
- /users/getReview
- /pullRequest/create
| Метрика | Значение |
|---|---|
| RPS | 96.2 |
| Latency (p95) | 4.83ms |
| Latency (p99) | 6.08ms |
| Успешность | 74.22% |
| Checks passed | 100% |
Производительность отличная
- Все thresholds выполнены
- Response time < 5ms (p95)
- 100% функциональных проверок пройдено
Замечания
- 25.78% запросов возвращают 404/409 (ожидаемое поведение при дублировании данных)
Сервис готов к production. Отличные показатели производительности и стабильности.
- Version: 2
- Timeout: 5 минут
- Go version: 1.23
- Пропускаемые директории:
vendor/,tests/
| Линтер | Назначение |
|---|---|
| errcheck | Проверка необработанных ошибок |
| staticcheck | Статический анализ кода |
| govet | Стандартный Go vet |
| ineffassign | Неиспользуемые присваивания |
| gocyclo | Циклическая сложность (max: 15) |
| gocognit | Когнитивная сложность (max: 20) |
| funlen | Длина функций (max: 80 строк) |
| gosec | Проверка безопасности |
| bodyclose | Закрытие HTTP body |
| dupl | Дублирование кода |
| misspell | Опечатки |
| revive | Стиль и best practices |
- Проверка type assertions
- Проверка пустых возвратов
- Минимальная сложность: 15
- Максимум строк: 80
- Максимум выражений: 50
- Проверка экспортированных функций
- Контроль импортов
- Правила работы с context