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

Небольшие правила — большая разница

Хорошие тесты следуют нескольким привычкам:

1. Понятные имена — TestGreetEmptyName говорит, что сломалось, не открывая файл.
2. Одно поведение на тест — маленькие тесты указывают прямо на проблему.
3. Таблицы для множества случаев — один цикл вместо скопированных тестов.
4. Сообщения с got и want — падение теста должно объяснять себя само.
5. t.Error, чтобы увидеть всё, t.Fatal, когда продолжать бессмысленно.
6. Запускайте тесты часто — после каждого небольшого изменения, а не один раз в конце.
7. Тесты живут рядом с кодом — та же папка, суффикс _test.go.


Сообщения о падении, которые помогают

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

Соглашение Go — Func(input) = got; want want. С %q строки берутся в кавычки, поэтому пропущенные пробелы или знаки препинания видны сразу.

Сообщение со всей историей

Greet возвращает неправильное приветствие. Сообщение о падении показывает вызов, got и want — ошибка (не то слово, пропущенные запятая и восклицательный знак) видна уже в одном выводе, без открытия кода.

Prompt
Напишите файл теста на Go, где функция Greet возвращает неправильное приветствие («Хай Ana» вместо «Привет, Ana!»), а тест сообщает о падении по соглашению Go: вызов, значение got и значение want, используя %q, чтобы строки были в кавычках. Покажите вывод go test -v с падением теста.
Вывод: программа на Go и захваченный вывод

Одно поведение на один тест

Тест, который проверяет пять вещей, имеет пять причин упасть — а его имя может описать только одну из них. Разделение по поведению делает каждый тест маленьким, а его имя — честным.

Здесь обычное приветствие и запасной вариант для пустого имени — это два поведения, поэтому им достаются два теста. Когда один падает, его имя уже говорит, какое поведение сломалось.

Два поведения — два теста

TestGreetName проверяет обычный случай, TestGreetEmpty — запасной вариант. Подробный вывод перечисляет их по отдельности — падение указало бы ровно на одно поведение.

Prompt
Напишите файл теста на Go с функцией Greet, которая приветствует по имени и использует запасной вариант «Привет, незнакомец!» для пустого имени. Напишите два отдельных сфокусированных теста, по одному на каждое поведение, с именами, которые говорят, что они проверяют. Покажите успешный вывод go test -v, где перечислены оба теста.
Вывод: программа на Go и захваченный вывод

Сколько кода протестировано: покрытие

go test -cover измеряет, какую часть вашего кода тесты действительно выполняют, в процентах от инструкций.

Это число — компас, а не цель: низкое значение показывает непроверенные пути — здесь тест проходит только по ветке mild, поэтому ветки freezing и hot не проверяются никогда. Покрытие в 100% не доказывает, что код правильный, но непокрытые строки гарантированно не проверены.

Измеряем покрытие

У Describe три ветки, а тест задействует одну. Число покрытия это раскрывает — тесты для холодной и жаркой веток подняли бы его.

Prompt
Напишите файл теста на Go с функцией Describe, которая возвращает freezing, mild или hot в зависимости от температуры, и один тест, который проверяет только ветку mild. Покажите вывод go test -cover с процентом покрытия.
Вывод: программа на Go и захваченный вывод
Measure the coverage