Назад к урокам

Тестирование в Go

Урок рассказывает о том, как работает тестирование в Go: структура тестовых файлов, основы использования пакета testing, написание простых и табличных тестов, а также ключевые функции для проверки результатов и регистрации ошибок.

Начинающий12 min

🧪 Тестирование в Go

Тестирование - важная часть разработки. Оно помогает предотвращать регрессии, упрощает сопровождение кода и гарантирует, что программа работает так, как задумано.

Go предоставляет встроенный пакет testing, который делает тестирование простым, удобным и единообразным.


🔍 Почему важно тестировать?

  • предотвращает возврат старых ошибок (регрессии);
  • подтверждает, что код соответствует требованиям;
  • облегчает рефакторинг;
  • делает проект более надёжным.

Go не разделяет юнит- и интеграционные тесты - оба вида создаются одинаково.


📁 Где размещаются тесты

Каждый тест находится в отдельном файле:

importantPkg.go
importantPkg_test.go

Правила:

  • имя тестового файла должно заканчиваться на _test.go;
  • тесты находятся в том же пакете, что и код, который они проверяют.

🧩 Пример проверяемой функции

package main

import "regexp"

func IsValidEmail(addr string) bool {
    re, ok := regexp.Compile(`.+@.+\..+`)
    if ok != nil {
        panic("failed to compile regex")
    }
    return re.Match([]byte(addr))
}

🧪 Простейший тест

package main

import "testing"

func TestIsValidEmail(t *testing.T) {
    data := "email@example.com"
    if !IsValidEmail(data) {
        t.Errorf("IsValidEmail(%v)=false, want true", data)
    }
}

▶️ Запуск тестов

go test

🧰 Основные функции тестирования

Пакет testing предоставляет полезные методы:

  • t.Errorf() - пометить тест как проваленный и вывести сообщение;
  • t.Fail() - пометка как fail без сообщения;
  • t.FailNow() - немедленный провал и прекращение теста;
  • t.Fatalf() - аналог Errorf, но прерывает выполнение теста;
  • t.Logf() - вывести сообщение (видно при провале теста или с -v).

📊 Test Tables (табличные тесты)

Иногда нужно протестировать несколько наборов данных. Для этого используют таблицы:

func TestIsValidEmailTable(t *testing.T) {
    table := []struct {
        email string
        want  bool
    }{
        {"email@example.com", true},
        {"missing@tld", false},
        // ...
    }

    for _, data := range table {
        result := IsValidEmail(data.email)
        if result != data.want {
            t.Errorf("%v: got %t, want %t", data.email, result, data.want)
        }
    }
}

Преимущества тест-таблиц:

  • легко добавлять новые случаи;
  • структура теста остаётся простой;
  • хорошо читаются;
  • поощряют чистоту и предсказуемость тестов.

📘 Итоги

  • тесты в Go используют пакет testing;
  • файлы должны заканчиваться на _test.go;
  • тесты запускаются командой go test;
  • t.Errorf, t.Fatalf, t.Logf и другие функции помогают оформлять тесты;
  • test tables позволяют легко тестировать множество входных данных.