Какие считаешь тесты нужно писать

Ответ

Для обеспечения надежности и качества бэкенд-приложения я считаю необходимым писать следующие типы тестов:

  1. Юнит-тесты (Unit Tests):

    • Что тестируют: Отдельные функции, методы или небольшие компоненты в изоляции от внешних зависимостей (используя моки или стабы).
    • Цель: Проверить корректность бизнес-логики и алгоритмов. Они быстрые и позволяют точно определить место ошибки.
    • Пример (Go):

      func Add(a, b int) int {
          return a + b
      }
      
      func TestAdd(t *testing.T) {
          got := Add(2, 3)
          want := 5
          if got != want {
              t.Errorf("Add(2, 3) = %d; want %d", got, want)
          }
      }
  2. Интеграционные тесты (Integration Tests):

    • Что тестируют: Взаимодействие между несколькими компонентами или сервисами (например, приложение с базой данных, внешним API, очередью сообщений).
    • Цель: Убедиться, что компоненты правильно работают вместе.
    • Пример (Go HTTP-хендлер):

      import (
          "net/http"
          "net/http/httptest"
          "testing"
      )
      
      // Предположим, у нас есть такой хендлер
      func userHandler(w http.ResponseWriter, r *http.Request) {
          // Логика обработки запроса пользователя
          w.WriteHeader(http.StatusOK)
          w.Write([]byte("User data"))
      }
      
      func TestUserHandler(t *testing.T) {
          req := httptest.NewRequest("GET", "/user/1", nil)
          rr := httptest.NewRecorder() // ResponseRecorder записывает ответ
      
          userHandler(rr, req) // Вызываем наш хендлер
      
          if rr.Code != http.StatusOK {
              t.Errorf("Expected status %d, got %d", http.StatusOK, rr.Code)
          }
          if rr.Body.String() != "User data" {
              t.Errorf("Expected body 'User data', got '%s'", rr.Body.String())
          }
      }
  3. E2E-тесты (End-to-End Tests):

    • Что тестируют: Весь пользовательский сценарий от начала до конца, имитируя реальное взаимодействие пользователя с системой (через UI или публичные API).
    • Цель: Проверить критически важные бизнес-процессы в полностью развернутой системе. Они медленные и более хрупкие.

Приоритет и покрытие:

  • Приоритет: Юнит-тесты (быстрые, изолированные) → Интеграционные (проверяют взаимодействие) → E2E (проверяют систему целиком).
  • Покрывать тестами следует в первую очередь ключевую бизнес-логику и критические пользовательские сценарии, а не стремиться к 100% покрытию кода любой ценой.