Микросервис для управления виртуальными монетами и покупки мерча в Avito.
- Docker 20.10+
- Docker Compose 2.20+
- Клонировать репозиторий:
git clone https://github.com/maksemen2/avito-task.git cd avito-task - Запустить сервисы:
make deploy # Или docker compose up --build
Сервис будет доступен на http://localhost:8080
make lint # Проверка стиля кода
make lint-fix # Автоисправление стиля
make build # Сборка проекта
make run # Локальный запуск
make deploy # Запуск в Docker
make tests # Запуск тестовОсновные компоненты:
- Язык: Go 1.22
- Фреймворк: Gin
- База данных: PostgreSQL
- ORM: GORM
- Логирование: Zap
- JWT: golang-jwt
Тестирование:
- Юнит-тесты: testify
- E2E тесты: httptest
Запуск тестов:
make tests
# Или
go test -v --cover ./internal/services/... ./internal/repository/... ./internal/handlers/...- Покрытие кода тестами выше 40%
- Написаны E2E тесты всех сценариев, которые я смог придумать
Результаты тестирования с использованием Locust (Python 3.6+):
Сценарий:
- Авторизация пользователя
- Случайные переводы монет
- Покупка случайного товара
- Проверка баланса
- Получение информации при невозможности операций
В данном тесте ошибочными считаются ответы 500, 401 и 504. При 500 и 504 коде сервер не обработал запрос как нужно, а при 401 - запрос не попал в хендлер.
Метрики:
- RPS: 1726.2
- Среднее время ответа: 47.33 мс
- Успешность: 100%
- Операции:
- Покупки: 9,096
- Переводы: 18,014
- Пользователи: 4,961
Запуск теста:
pip install locust
locust -f load_test/locustfile.py --host=http://localhost:8080Конфигурация линтера: .golangci.yaml
Проверяемые правила:
- bodyclose
- dupl
- gochecknoglobals
- gochecknoinits
- goconst
- gocyclo
- gofmt
- misspell
- nakedret
- rowserrcheck
- copyloopvar
- stylecheck
- unconvert
- whitespace
- wsl
