Урок рассказывает о том, как работает тестирование в Go: структура тестовых файлов, основы использования пакета testing, написание простых и табличных тестов, а также ключевые функции для проверки результатов и регистрации ошибок.
Тестирование - важная часть разработки. Оно помогает предотвращать регрессии, упрощает сопровождение кода и гарантирует, что программа работает так, как задумано.
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).Иногда нужно протестировать несколько наборов данных. Для этого используют таблицы:
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)
}
}
}
Преимущества тест-таблиц:
testing;_test.go;go test;t.Errorf, t.Fatalf, t.Logf и другие функции помогают оформлять
тесты;