Покрытие тестами и testify
go test -cover и библиотека утверждений testify
«Покрытие тестами и testify» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
go test -cover
Добавьте -cover к любой команде go test, чтобы вывести процент покрытия для каждого пакета.
go test -cover ./...
// ok myapp 68.4% of statementsПрофиль покрытия
Создайте файл профиля покрытия и просмотрите его в формате HTML, чтобы увидеть, какие строки покрыты тестами:
go test -coverprofile=c.out ./...
go tool cover -html=c.out -o coverage.htmlПорог покрытия в CI
Обеспечьте минимальный уровень покрытия с помощью однострочной команды оболочки:
pct=$(go test -cover ./... | awk '/coverage/ {gsub(/%/,""); print $NF}')
[ "${pct%.*}" -ge 80 ] || { echo "Coverage $pct% below 80%"; exit 1; }Стопроцентное покрытие — не цель
Покрытие показывает, какие строки выполняются, но не показывает, содержательны ли проверки. Стремитесь к высокому покрытию критически важных путей и допускайте более низкое покрытие недостижимых ветвей обработки ошибок.
testify/assert
github.com/stretchr/testify/assert предоставляет удобные проверки и автоматически сообщает ожидаемые и фактические значения:
assert.Equal(t, 42, result)
assert.NoError(t, err)
assert.Contains(t, list, "item")
assert.True(t, isValid)testify/require
require идентичен assert, но при сбое вызывает t.FailNow() и немедленно останавливает тест, подобно t.Fatal.
require.NoError(t, err) // stop if err != nil
// Subsequent code only runs if err is niltestify/suite
testify/suite группирует связанные тесты в структуре с общей настройкой и очисткой, подобно наборам тестов xUnit:
type UserSuite struct { suite.Suite; db *DB }
func (s *UserSuite) SetupTest() { s.db = openTestDB() }
func (s *UserSuite) TestCreate() { /* ... */ }
func TestUserSuite(t *testing.T) { suite.Run(t, new(UserSuite)) }assert.ElementsMatch
Сравните срезы, не учитывая порядок элементов:
assert.ElementsMatch(t, []int{3,1,2}, []int{1,2,3})assert.JSONEq
Сравните строки JSON независимо от порядка ключей:
assert.JSONEq(t, `{"a":1,"b":2}`, `{"b":2,"a":1}`)Пользовательские проверки
Оберните testify в собственные вспомогательные функции проверки, чтобы добавлять контекст предметной области в сообщения об ошибках:
func assertUserValid(t testing.TB, u *User) {
t.Helper()
assert.NotEmpty(t, u.Name)
assert.Positive(t, u.ID)
}Объединение покрытия с testify
testify не влияет на отчёт о покрытии — покрытие учитывает только выполнение строк, независимо от используемой библиотеки проверок.
Быстрая проверка
В чём разница между testify/assert и testify/require?
Итоги: покрытие и testify
Основные положения:
- go test -cover; -coverprofile для отчёта HTML
- assert: продолжает выполнение после сбоя; require: останавливает выполнение после сбоя
- testify/suite для объединения тестов с общей настройкой
- Высокое покрытие — это хорошо, но содержательные проверки важнее
Часто задаваемые вопросы
Урок «Покрытие тестами и testify» бесплатный?
Да — полный текст урока «Покрытие тестами и testify» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Покрытие тестами и testify»?
go test -cover и библиотека утверждений testify Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Покрытие тестами и testify»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Написание модульных тестов с testing
- Тесты на основе таблиц
- Тестовые двойники: имитации и заглушки
- Покрытие тестами и testify