0Pricing
Go Academy · Урок

Покрытие тестами и 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 nil

testify/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 — локальная установка не требуется.

Все уроки этого курса

  1. Написание модульных тестов с testing
  2. Тесты на основе таблиц
  3. Тестовые двойники: имитации и заглушки
  4. Покрытие тестами и testify
← Назад к Go Academy