Перейти к основному содержимому

Два способа сообщить о падении

Тест может сообщить о проблеме двумя способами, и разница в том, что происходит дальше:

t.Errorf помечает тест как упавший и продолжает работу. Оставшаяся часть теста всё равно выполняется, поэтому за один запуск можно увидеть сразу несколько проблем.

t.Fatalf помечает тест как упавший и немедленно останавливает его. Используйте его тогда, когда продолжать бессмысленно — следующие строки либо аварийно завершатся, либо выдадут лишний шум.

У обоих есть простые близнецы без форматирования: t.Error(...) и t.Fatal(...) просто печатают свои аргументы.


t.Errorf: сообщить и продолжить

Когда тест проверяет несколько случаев подряд, t.Errorf — подходящий инструмент: о сломанном случае сообщается, а следующие случаи всё равно проверяются.

Так один запуск go test показывает вам весь объём поломок — а не только первый сломанный случай.

Увидеть все сломанные случаи сразу

Эта функция Add игнорирует b, поэтому все три проверки падают. Так как они используют t.Errorf, все три сообщения появляются в одном запуске — с t.Fatalf вы увидели бы только первое.

Prompt
Напиши тестовый файл на Go, в котором функция Add содержит ошибку (она возвращает только a, игнорируя b), а TestAdd проверяет три разные суммы с помощью t.Errorf, чтобы о каждом сломанном случае было сообщено. Покажи вывод go test -v со всеми тремя сообщениями о падении в одном запуске.
Вывод: программа на Go и захваченный вывод

t.Fatalf: остановиться сразу

Иногда неудачная проверка означает, что остальная часть теста работать не может. Типичный случай: тест сначала готовит значение, а затем изучает его. Если подготовка уже пошла не так, изучать его бесполезно или даже опасно — программа может аварийно завершиться.

t.Fatalf останавливает тест прямо на этом месте. Проверки после него не выполняются никогда — и в этом весь смысл.

Остановиться до бесполезных проверок

В функции Split есть ошибка (она разбивает строку по неправильному символу), поэтому возвращается 1 часть вместо 3. t.Fatalf сообщает об этом и останавливает тест — до проверки первой части ниже дело не доходит.

Prompt
Напиши тестовый файл на Go, в котором функция Split должна разбивать строку, разделённую запятыми, но содержит ошибку (разбивает по неправильному символу). Тест сначала проверяет количество частей с помощью t.Fatalf, а затем проверяет первую часть с помощью t.Errorf. Покажи вывод go test -v, где фатальная ошибка останавливает тест до второй проверки.
Вывод: программа на Go и захваченный вывод
Stop before the useless checks

Error и Fatal без форматирования

Когда вам не нужны подстановки %d или %q, используйте простые формы: t.Error("сообщение") и t.Fatal("сообщение"). Они ведут себя точно так же, как их близнецы с f, — сообщить и продолжить или сообщить и остановиться.

Простые сообщения

Две простые логические проверки с обычными сообщениями t.Error. Здесь обе проходят, поэтому сообщения молчат, а запуск печатает PASS.

Prompt
Напиши тестовый файл на Go с функцией IsEven и тестом, который проверяет, что IsEven(4) равно true, а IsEven(3) равно false, используя простые сообщения t.Error без глаголов форматирования. Покажи успешный вывод go test -v.
Вывод: программа на Go и захваченный вывод
Plain messages