🧪 Тестирование в 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 позволяют легко тестировать множество входных данных.