206 lines
5.0 KiB
Markdown
206 lines
5.0 KiB
Markdown
# 🧪 Руководство по тестированию 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
|
||
``` |