feat: some refactoring
This commit is contained in:
206
docs/testing_guide.md
Normal file
206
docs/testing_guide.md
Normal 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
|
||||
```
|
||||
Reference in New Issue
Block a user