Skip to content

Repository files navigation

О проекте

В этом репозитории представлено решение тестового задания на стажировку Авито "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 up

Swagger документация будет доступна по адресу 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. Отличные показатели производительности и стабильности.

Конфигурация golangci-lint

Базовые параметры

  • 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

Настройки линтеров

errcheck

  • Проверка type assertions
  • Проверка пустых возвратов

gocyclo

  • Минимальная сложность: 15

funlen

  • Максимум строк: 80
  • Максимум выражений: 50

revive

  • Проверка экспортированных функций
  • Контроль импортов
  • Правила работы с context

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages