feat: some refactoring

This commit is contained in:
2025-11-22 22:23:49 +03:00
parent a247e6213e
commit 51f30b516e
29 changed files with 1094 additions and 129 deletions

206
docs/testing_guide.md Normal file
View File

@@ -0,0 +1,206 @@
# 🧪 Руководство по тестированию MyGoServer
## Быстрый старт
### Способы запуска тестов:
1. **Через Makefile (рекомендуется)**:
```bash
make test # Все тесты
make test-unit # Только unit тесты
make test-coverage # Тесты с покрытием
make test-race # С race detector
```
2. **Через скрипты**:
```bash
./scripts/test.sh # Все тесты с отчетом
./scripts/test.sh "TestName" # Конкретные тесты
```
3. **Ручной запуск**:
```bash
go test ./... # Все тесты
go test -v ./internal/apiserver/... # Verbose вывод
go test -race ./... # С race detector
```
## Детальное руководство
### 📊 Покрытие кода (Coverage)
```bash
# Генерация отчета о покрытии
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out -o coverage.html
# Просмотр покрытия в терминале
go tool cover -func=coverage.out
```
### 🏁 Race Detector
Поиск гонок данных (data races):
```bash
go test -race ./...
# Для более глубокой проверки
go test -race -count=10 ./...
```
### 📈 Benchmark тесты
Для измерения производительности:
```bash
go test -bench=. -benchmem ./...
# Для конкретных функций
go test -bench=BenchmarkHomeHandler -benchmem ./internal/apiserver/...
```
### 🎯 Запуск по паттернам
```bash
# Только тесты с определенным именем
go test -run TestHome ./...
# Исключить некоторые тесты
go test -run '^(?!TestIntegration).*' ./...
# Искать по нескольким паттернам
go test -run 'TestHome|TestConfig' ./...
```
### 🔄 Непрерывное тестирование
Для разработки с автоперезапуском тестов:
```bash
# Установка gotest-watcher
go install github.com/bitfield/gotest@latest
# Автоматический запуск тестов при изменении файлов
gotest -w ./...
```
### 📊 Отчеты и анализ
#### HTML отчет о покрытии:
- `coverage.html` - веб-интерфейс покрытия
- `coverage.out` - данные покрытия
#### JSON отчет (для CI/CD):
```bash
go test -json ./... > test-report.json
```
#### Логи в файл:
```bash
go test -v ./... > test.log 2>&1
```
## 🏗️ Структура тестов
### Unit тесты:
```
internal/apiserver/handlers/
├── home_test.go
├── middleware_test.go
└── ...
internal/apiserver/models/
├── response_test.go
└── ...
```
### Integration тесты:
```
test/integration/
├── api_test.go
├── server_test.go
└── ...
```
### Файлы конфигурации для тестов:
```
test/
├── fixtures/ # Тестовые данные
├── helpers/ # Вспомогательные функции
└── testdata/ # Статические данные
```
## 🔧 Настройка окружения тестирования
### Переменные окружения:
```bash
export TEST_ENV=development
export LOG_LEVEL=debug
export CONFIG_PATH=./configs/development.toml
```
## 📝 Примеры тестов
### Базовый тест:
```go
func TestHomeHandler_ServeHTTP(t *testing.T) {
handler := handlers.NewHomeHandler()
req := httptest.NewRequest("GET", "/", nil)
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
if status := rr.Code; status != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
status, http.StatusOK)
}
}
```
### Тест с моками:
```go
func TestConfig_Load(t *testing.T) {
// Мок конфигурации
cfg := &Config{
Server: ServerConfig{
Address: ":8080",
},
}
if cfg.Server.Address != ":8080" {
t.Error("Config not loaded correctly")
}
}
```
### Benchmark тест:
```go
func BenchmarkHomeHandler_ServeHTTP(b *testing.B) {
handler := handlers.NewHomeHandler()
b.ResetTimer()
for i := 0; i < b.N; i++ {
req := httptest.NewRequest("GET", "/", nil)
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
}
}
```
## 🚀 Быстрые команды
```bash
# Проверка всех аспектов качества кода
make test-coverage && make vet && make fmt
# Быстрый цикл разработки
make test-watch
# Полная проверка проекта
make build && make test-race && make lint
# Тестирование конкретного компонента
make test-pattern PATTERN=TestHome
```