Табличные тесты через пакет 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 при завершении каждого подтеста. Именно по этим строкам удобно читать, какой конкретный случай из таблицы не прошёл — особенно когда таблица большая.
Главный вывод из мутационной проверки: если тест не упал на сломанной реализации, он не доказывает корректность функции. Добавьте в таблицу случай, который покрывает пропущенный контракт, и повторите.
