Как устроено тестирование в Go и какие виды тестов вы знаете?

Ответ

Тестирование в Go встроено в язык и инструментарий. Основные инструменты — это пакет testing и команда go test.

Файлы с тестами должны иметь суффикс _test.go (например, sum_test.go) и находиться в том же пакете, что и тестируемый код.

Основные компоненты пакета testing:

  1. Unit-тесты (TestXxx): Проверяют корректность работы отдельных функций или методов. Функция теста принимает t *testing.T.

    // Файл: sum.go
    func Sum(a, b int) int {
        return a + b
    }
    
    // Файл: sum_test.go
    func TestSum(t *testing.T) {
        result := Sum(2, 3)
        expected := 5
        if result != expected {
            t.Errorf("Sum(2, 3) = %d; ожидалось %d", result, expected)
        }
    }
  2. Бенчмарки (BenchmarkXxx): Измеряют производительность кода. Функция теста принимает b *testing.B.

    func BenchmarkSum(b *testing.B) {
        for i := 0; i < b.N; i++ {
            Sum(1, 2)
        }
    }
  3. Fuzz-тестирование (FuzzXxx): Автоматически генерирует входные данные для поиска пограничных случаев и уязвимостей (добавлено в Go 1.18).

Виды тестирования по уровню:

  • Модульное (Unit): Изолированная проверка наименьших частей кода (функций, методов).
  • Интеграционное: Проверка взаимодействия нескольких компонентов системы (например, сервис и база данных).
  • End-to-End (E2E): Тестирование полного пользовательского сценария через внешние интерфейсы системы (например, через API).

Популярные сторонние библиотеки:

  • testify/assert и testify/require: Предоставляют удобные функции-утверждения для проверок. assert сообщает об ошибке и продолжает выполнение теста, require — останавливает.
  • gomock: Фреймворк для создания мок-объектов (заглушек) на основе интерфейсов.