Как писать модульные тесты в Golang? Модульное тестирование  —  важный аспект программной разработки, благодаря которому работа каждого отдельного компонента обходится без неожиданностей.

Начнем со встроенного в Golang пакета testing, затем расширим его функциональность с помощью Testify  —  популярной библиотеки ассертов и мок-объектов. И завершим четким пониманием того, как в Go создаются модульные тесты.

Пишем первый модульный тест

В Go названия тестовых файлов заканчиваются на _test.go, а названия тестируемых функций предваряются словом Test, благодаря чему командой go test эти функции распознаются и запускаются.

Командой go test запускаются тесты, автоматически обнаруживаются и выполняются все тестовые функции в пакете.

Рассмотрим функцию CountWords, ею принимается строковый ввод и возвращается количество слов в тексте, возвращением 0 удаляются все начальные или конечные пробелы и обрабатываются пустые строки или строки из одних пробелов:

func CountWords(text string) int {
if len(strings.TrimSpace(text)) == 0 {
return 0
}
words := strings.Fields(text)
return len(words)
}

Проверим корректность работы функции CountWords, написав тесты для различных входных данных, например обычного предложения и предложения с дополнительными пробелами:

func TestCountWords(t *testing.T) {
sentence := "Go is awesome"
actual := CountWords(sentence)
expected := 3

if actual != expected {
t.Errorf("CountWords(%q) = %d, Should be %d", sentence, actual, expected)
}
}

func TestCountWordsWithWhiteSpaces(t *testing.T) {
sentence := " Go "
actual := CountWords(sentence)
expected := 1

if actual != expected {
t.Errorf("CountWords(%q) = %d, Should be %d", sentence, actual, expected)
}
}

Функции TestCountWords и TestCountWordsWithWhiteSpaces  —  это два тестовых сценария для CountWords. Обеими принимается параметр *testing.T пакета testing. Параметром регистрируются ошибки и контролируется ход выполнения теста.

  • Тестом TestCountWords проверяется, правильно ли функцией считаются слова в обычном предложении Go is awesome. Ожидаемое количество слов  —  3. Если фактический результат другой, для регистрации соответствующей ошибки вызывается функция t.Errorf.
  • Тестом TestCountWordsWithWhiteSpaces проверяется корректность обработки функцией дополнительных пробелов. На входе в предложении " Go " содержатся начальные и конечные пробелы, но функцией возвращается 1, ведь слово все равно одно.

Усовершенствование тестов с помощью Testify

С библиотекой Testify ассерты делаются проще и выразительнее. А благодаря ее функционалу, например мок-объектам, пишутся более гибкие, всесторонние тесты. Посмотрим, как совершенствуются тестовые сценарии с Testify.

Сначала устанавливаем пакет Testify такой командой терминала:

go get github.com/stretchr/testify

С Testify модульные тесты писать проще, они более понятные и читаемые благодаря удобным функциям ассертов:

func TestCountWords(t *testing.T) {
sentence := "Go is awesome"
actual := CountWords(sentence)
expected := 3

assert.Equal(t, expected, actual, "they should be equal")
}

func TestCountWordsWithWhiteSpaces(t *testing.T) {
sentence := " Go "
actual := CountWords(sentence)
expected := 1

assert.Equal(t, expected, actual, "they should be equal")
}

Заключение

С ассертами и другим функционалом Testify тесты становятся более понятными, сопровождаемыми, гибкими. Должная работа функций проверяется здесь выразительнее и лаконичнее, чем написанием пользовательских сообщений об ошибках и ручным сравнением значений. Этим подходом поддерживается согласованность кода с соблюдением принципа DRY, особенно при написании тестовых сценариев.

Чтобы писать более удобные для восприятия и сопровождения модульные тесты, сочетайте встроенный пакет тестирования Go с функционалом Testify. Благодаря, например, мок-объектам тесты делаются более надежными и гибкими, а еще с Testify упрощаются ассерты.

Ознакомьтесь с документацией и репозиторием GitHub.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Kadir Doğuş Seçkin: Enhancing Golang Unit Tests: From Standard Testing to Testify

Предыдущая статьяРендеринг больших табличных данных в браузере
Следующая статьяТоп-25 полезных советов для React-разработчиков. Часть 2