Как писать модульные тесты в 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.
Читайте также:
- Как упростить работу с базами данных в Golang с SQLX
- Почему стоит использовать GoFr для разработки Golang-бэкенда?
- Типы функций и функции высшего порядка на Go
Читайте нас в Telegram, VK и Дзен
Перевод статьи Kadir Doğuş Seçkin: Enhancing Golang Unit Tests: From Standard Testing to Testify