🤔 Как в Go пишут unit тесты со стандартным пакетом testing ?



Стандартный пакет testing предоставляет инструменты для написания и выполнения юнит-тестов. Давайте рассмотрим, как писать юнит-тесты с использованием этого пакета.



🚩Основные компоненты



🟠Тестовые файлы: Должны иметь суффикс _test.go. Это позволяет инструменту тестирования Go автоматически распознавать их как тестовые файлы.

🟠Тестовые функции: Должны начинаться с Test и принимать один аргумент типа *testing.T. Это соглашение позволяет инструменту тестирования Go идентифицировать их как тестовые функции.



package main



func Add(a, b int) int {

return a + b

}

// main_test.go

package main



import "testing"



func TestAdd(t *testing.T) {

result := Add(2, 3)

expected := 5

if result != expected {

t.Errorf("Add(2, 3) = %d; want %d", result, expected)

}

}




Чтобы это сделать, выполните команду go test в терминале. Эта команда автоматически найдет и выполнит все тесты в текущем пакете: $ go test



Тестирование с таблицей (table-driven tests): Это подход, при котором вы пишете тесты в виде таблицы входных и ожидаемых значений. Это улучшает читаемость и позволяет легко добавлять новые тестовые случаи.

package main



import "testing"



func TestAdd(t *testing.T) {

tests := []struct {

a, b, expected int

}{

{1, 2, 3},

{0, 0, 0},

{-1, -1, -2},

{2, 2, 4},

}



for _, tt := range tests {

result := Add(tt.a, tt.b)

if result != tt.expected {

t.Errorf("Add(%d, %d) = %d; want %d", tt.a, tt.b, result, tt.expected)

}

}

}




Бенчмаркинг: Для измерения производительности кода используйте функции, начинающиеся с Benchmark и принимающие *testing.B.

package main



import "testing"



func BenchmarkAdd(b *testing.B) {

for i := 0; i < b.N; i++ {

Add(2, 3)

}

}




Примерные тесты (Example Tests)


package main



import "fmt"



func ExampleAdd() {

fmt.Println(Add(2, 3))

// Output: 5

}




🚩Лучшие практики написания данных тестов



🟠Соблюдайте атомарность: Каждый юнит-тест должен проверять только одну конкретную функцию или метод и проверять один аспект её поведения.

🟠Используйте понятные названия: Имена тестовых функций должны быть понятными и отражать их цель. Например, TestAdd для тестирования функции Add.

🟠Проверяйте крайние случаи: Убедитесь, что ваши тесты проверяют крайние случаи и потенциальные ошибки, такие как нулевые значения, отрицательные числа и переполнения.

🟠Регулярно запускайте тесты: Особенно перед коммитами и релизами, чтобы убедиться в отсутствии регрессий.

🟠Используйте mocking, если необходимо: При тестировании функций, которые зависят от внешних ресурсов (таких как базы данных или API), используйте мокирование (mocking) для изоляции тестов.



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

🟠Запуск всех тестов с подробным выводом: $ go test -v

🟠Запуск бенчмарков: $ go test -bench=.

🟠Покрытие кода: Чтобы увидеть покрытие тестами, используйте флаг -cover:$ go test -cover



Юнит-тесты пишутся в файлах с суффиксом _test.go и выполняются с помощью команды go test. Они проверяют отдельные функции или методы, чтобы убедиться, что они работают корректно. Пакет testing предоставляет все необходимые инструменты для написания и выполнения тестов, бенчмарков и примерных тестов.



Ставь 👍 и забирай 📚 Базу знаний