Пакеты, тестирование, файлы и JSON

Табличные тесты через пакет testing и go test

Содержание курса

Мутационная проверка теста и чтение вывода go test ./... и go test -v ./...

Тест, который всегда проходит, ничего не гарантирует. Прежде чем доверять своим проверкам, убедитесь, что они действительно умеют ловить ошибку.

Внесите целевую мутацию в Square — намеренно сломайте именно то поведение, которое тест должен проверять:

// мутант: возвращает input вместо input*input
func Square(n int) int {
    return n  // было: return n * n
}

Теперь запустите:

go test ./...

Вывод:

--- FAIL: TestSquare (0.00s)
    --- FAIL: TestSquare/positive (0.00s)
        mathutil_test.go:18: Square(3) = 3, want 9
    --- FAIL: TestSquare/negative (0.00s)
        mathutil_test.go:18: Square(-2) = -2, want 4
FAIL
FAIL    example.com/mymod/mathutil  0.001s

Обратите внимание: случай zero прошёл (Square(0) возвращает 0 даже на мутанте), а positive и negative упали. Это именно то, что нужно: тест обнаружил конкретную мутацию.

Восстановите реализацию:

func Square(n int) int {
    return n * n
}

И снова запустите:

go test ./...
ok  	example.com/mymod/mathutil  0.001s

При успехе go test ./... выводит только одну строку на пакет. Никакого упоминания отдельных тест-функций и подтестов — минимальный сигнал «всё хорошо».

Если хотите видеть полную картину даже при успехе:

go test -v ./...
=== RUN   TestSquare
=== RUN   TestSquare/zero
--- PASS: TestSquare/zero (0.00s)
=== RUN   TestSquare/positive
--- PASS: TestSquare/positive (0.00s)
=== RUN   TestSquare/negative
--- PASS: TestSquare/negative (0.00s)
--- PASS: TestSquare (0.00s)
PASS
ok  	example.com/mymod/mathutil  0.001s

Флаг -v добавляет строки === RUN при старте и --- PASS / --- FAIL при завершении каждого подтеста. Именно по этим строкам удобно читать, какой конкретный случай из таблицы не прошёл — особенно когда таблица большая.

Главный вывод из мутационной проверки: если тест не упал на сломанной реализации, он не доказывает корректность функции. Добавьте в таблицу случай, который покрывает пропущенный контракт, и повторите.