Go:
Написання тестів

Як:

У Go тести зазвичай пишуться в тому ж пакеті, що й код, який вони тестують. Файли, що містять тести, називаються з суфіксом _test.go. Тести - це функції, які приймають вказівник на об’єкт testing.T (з пакету testing) як аргумент, і вони сигналізують про невдачу, викликаючи методи, такі як t.Fail(), t.Errorf() тощо.

Приклад простого тесту для функції Add, визначеної у math.go:

// math.go
package math

func Add(x, y int) int {
    return x + y
}

Тестовий файл math_test.go:

package math

import "testing"

func TestAdd(t *testing.T) {
    result := Add(1, 2)
    expected := 3
    if result != expected {
        t.Errorf("Add(1, 2) = %d; хочеться %d", result, expected)
    }
}

Запустіть свої тести за допомогою команди go test у тій самій директорії, що й ваші тестові файли. Приклад виводу, що вказує на успішний тест, виглядатиме приблизно так:

PASS
ok      example.com/my/math 0.002s

Для тестів, що керуються таблицею, дозволяючи ефективно тестувати різні комбінації вхідних і вихідних даних, визначте зріз структур, що представляють випадки тестування:

func TestAddTableDriven(t *testing.T) {
    var tests = []struct {
        x        int
        y        int
        expected int
    }{
        {1, 2, 3},
        {2, 3, 5},
        {-1, -2, -3},
    }

    for _, tt := range tests {
        testname := fmt.Sprintf("%d+%d", tt.x, tt.y)
        t.Run(testname, func(t *testing.T) {
            ans := Add(tt.x, tt.y)
            if ans != tt.expected {
                t.Errorf("отримано %d, хочеться %d", ans, tt.expected)
            }
        })
    }
}

Поглиблений огляд

Фреймворк тестування Go, представлений в Go 1 разом з мовою, був розроблений для безперебійної інтеграції з інструментарієм Go, відображаючи наголос Go на простоті та ефективності в розробці програмного забезпечення. На відміну від деяких фреймворків тестування в інших мовах, які покладаються на зовнішні бібліотеки чи складні налаштування, вбудований пакет testing Go надає простий спосіб написання та запуску тестів.

Цікавим аспектом підходу Go до тестування є принцип “конвенція над конфігурацією”, якого він дотримується, як-от шаблон назви файлів (_test.go) та використання стандартних можливостей бібліотеки замість зовнішніх залежностей. Цей мінімалістичний підхід заохочує розробників писати тести, оскільки вхідний бар’єр є низьким.

Хоча вбудовані можливості тестування Go охоплюють багато аспектів, існують сценарії, в яких сторонні інструменти або фреймворки можуть пропонувати більше функціональностей, такі як генерація мок-об’єктів, фазз-тестування або тести у стилі BDD (розробка на основі поведінки). Популярні бібліотеки, такі як Testify або GoMock, доповнюють стандартні можливості тестування Go, пропонуючи більш виразні перевірки чи можливості генерації мок-об’єктів, які можуть бути особливо корисними в складних програмах із багатьма залежностями.

Незважаючи на існування цих альтернатив, стандартний пакет тестування Go залишається кутовим каменем для тестування у Go завдяки його простоті, ефективності і тісній інтеграції з мовою і інструментарієм. Чи вирішують розробники доповнювати його сторонніми інструментами чи ні, фреймворк тестування Go надає міцну основу для забезпечення якості коду і надійності.