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

Функции, которые возвращают ошибки

Многие функции в Go возвращают два значения: результат и ошибку error. При успехе ошибка равна nil; при неудаче результат — это нулевое значение, а ошибка объясняет, что пошло не так.

Тест для такой функции должен проверять оба пути: корректные входные данные возвращают правильное значение и ошибку nil, а некорректные действительно приводят к ошибке — функция, которая молча принимает неверные данные, это тоже ошибка.


Успешный путь

Для корректных входных данных сначала проверяйте ошибку: если она не nil, что-то пошло серьёзно не так и проверять значение уже бессмысленно — это задача для t.Fatalf. И только затем сравнивайте значение.

Корректные данные, ошибка nil

SafeDivide(10, 2) должна вернуть 5 и никакой ошибки. Сначала ошибка проверяется с помощью t.Fatalf, и только потом сравнивается значение.

Prompt
Напиши файл теста на Go с функцией SafeDivide, которая возвращает результат типа float64 и ошибку error (ошибка при делении на ноль). Напиши тест для успешного пути: SafeDivide(10, 2) должна вернуть 5 и ошибку nil — сначала проверь ошибку с помощью t.Fatalf, затем значение с помощью t.Errorf. Покажи вывод go test -v.
Вывод: программа на Go и захваченный вывод
Valid input, nil error

Путь с ошибкой

Вторая половина контракта: некорректные входные данные должны приводить к ошибке. Тест вызывает функцию с такими данными и падает, если ошибка равна nil.

Значение результата игнорируется с помощью _ — когда возвращается ошибка, значение не несёт никакого смысла.

Некорректные данные должны вернуть ошибку

Деление на ноль обязано завершиться неудачей. Если err вернулась как nil, тест падает с t.Fatal — функция приняла данные, которые должна была отвергнуть.

Prompt
Напиши тест на Go для пути с ошибкой функции SafeDivide: вызов с делителем 0 должен вернуть ошибку. Проигнорируй значение с помощью пустого идентификатора и заверши тест через t.Fatal, если ошибка равна nil. Покажи вывод go test -v.
Вывод: программа на Go и захваченный вывод
Bad input must return an error

Таблица с полем wantErr

Оба пути помещаются в один табличный тест: добавьте каждому тест-кейсу поле wantErr, которое указывает, ожидается ли ошибка.

Цикл сначала проверяет сторону ошибки — получена ошибка там, где её не ждали, или её нет там, где она ожидалась, это фатально для данного подтеста. Затем для успешных случаев значение сравнивается как обычно.

Успешные и ошибочные случаи в одной таблице

Четыре случая: три обычных деления и одно деление на ноль с wantErr: true. Один цикл покрывает весь контракт функции.

Prompt
Напиши табличный тест на Go для SafeDivide, где у каждого случая есть имя, два входных значения, ожидаемое значение и булево поле wantErr. Используй подтесты t.Run; фатально заверши тест, когда сторона ошибки не совпадает с wantErr, и сравнивай значение только для случаев без ожидаемой ошибки. Включи три обычных случая и одно деление на ноль. Покажи вывод go test -v.
Вывод: программа на Go и захваченный вывод
Good and bad cases in one table