Какие существуют основные виды тестирования в Backend-разработке?

Ответ

В backend-разработке используется несколько ключевых видов тестирования, которые образуют так называемую "пирамиду тестирования":

  1. Unit-тесты (Модульные тесты)

    • Цель: Проверка наименьших изолированных частей кода (функций, методов) без внешних зависимостей, таких как базы данных или сетевые сервисы. Они быстрые и составляют основу пирамиды.
    • Пример на Go:
    // функция для теста
    func Add(a, b int) int {
        return a + b
    }
    
    // тест
    func TestAdd(t *testing.T) {
        result := Add(2, 3)
        if result != 5 {
            t.Errorf("Ожидали 5, получили %d", result)
        }
    }
  2. Интеграционные тесты

    • Цель: Проверка взаимодействия нескольких компонентов системы между собой. Например, как ваш сервис работает с базой данных, кэшем или внешней очередью сообщений.
    • Пример на Go (тест репозитория с БД):
    func TestUserRepository_CreateUser(t *testing.T) {
        // Инициализация тестовой БД
        db := setupTestDB()
        defer db.Close()
    
        repo := NewUserRepository(db)
        user := &User{Name: "Test User"}
    
        err := repo.Create(user)
        if err != nil {
            t.Fatalf("Не удалось создать пользователя: %v", err)
        }
        // Здесь можно добавить проверку, что пользователь действительно появился в БД
    }
  3. End-to-End (E2E) тесты

    • Цель: Проверка полного пользовательского сценария через внешние интерфейсы системы (обычно API). Эти тесты имитируют поведение реального пользователя.
    • Пример на Go (тест API эндпоинта):
    func TestAPI_CreateUser(t *testing.T) {
        router := setupRouter() // Настройка роутера
    
        // Создаем HTTP запрос
        body := strings.NewReader(`{"name":"Test"}`)
        req := httptest.NewRequest("POST", "/users", body)
        req.Header.Set("Content-Type", "application/json")
    
        // Записываем ответ
        w := httptest.NewRecorder()
        router.ServeHTTP(w, req)
    
        // Проверяем результат
        if w.Code != http.StatusCreated {
            t.Errorf("Ожидали статус 201, получили %d", w.Code)
        }
    }

Другие важные виды тестов:

  • Нагрузочное тестирование: Проверка производительности и стабильности системы под высокой нагрузкой (инструменты: k6, JMeter, vegeta).
  • Smoke-тесты (Дымовые тесты): Быстрая проверка работоспособности основных функций после развертывания.
  • Регрессионное тестирование: Проверка того, что новые изменения не сломали существующий функционал.
  • Тестирование безопасности: Поиск уязвимостей в приложении (например, с помощью OWASP ZAP).