Пакет slogtest
Обзор
Пакет slogtest реализует поддержку тестирования реализаций обработчиков log/slog.Handler.
Пример (Разбор)
Этот пример демонстрирует один подход к тестированию обработчика с помощью этого пакета. Обработчик получает [bytes.Buffer] для записи, и каждая строка результирующего вывода анализируется. Для JSON-вывода [encoding/json.Unmarshal] создаёт результат в нужном формате, если получает указатель на map[string]any.
Код:
var buf bytes.Buffer
h := slog.NewJSONHandler(&buf, nil)
results := func() []map[string]any {
var ms []map[string]any
for _, line := range bytes.Split(buf.Bytes(), []byte{'\n'}) {
if len(line) == 0 {
continue
}
var m map[string]any
if err := json.Unmarshal(line, &m); err != nil {
panic(err) // In a real test, use t.Fatal.
}
ms = append(ms, m)
}
return ms
}
err := slogtest.TestHandler(h, results)
if err != nil {
log.Fatal(err)
}
Индекс
Примеры
Файлы пакета
slogtest.go
func Run 1.22
func Run(t *testing.T, newHandler func(*testing.T) slog.Handler, result func(*testing.T) map[string]any)
Run применяет slog.Handler к тем же тестовым случаям, что и TestHandler, но выполняет каждый случай в подтесте. Для каждого тестового случая сначала вызывается newHandler для получения экземпляра тестируемого обработчика, затем выполняется тестовый случай, а затем вызывается result для получения результата. Если тестовый случай завершается неудачно, вызывается t.Error.
func TestHandler 1.21
func TestHandler(h slog.Handler, results func() []map[string]any) error
TestHandler тестирует slog.Handler. Если TestHandler обнаруживает какие-либо ошибки, он возвращает ошибку для каждой из них, объединённую в одну ошибку с помощью errors.Join.
TestHandler устанавливает данный Handler в slog.Logger и выполняет несколько вызовов методов вывода Logger. Обработчик должен быть включён для уровней Info и выше.
Функция результатов вызывается после всех таких вызовов. Она должна возвращать срез map[string]any, по одному для каждого вызова метода вывода Logger. Ключи и значения карты должны соответствовать ключам и значениям вывода Handler. Каждая группа в выводе должна быть представлена своей вложенной map[string]any. Следует использовать стандартные ключи slog.TimeKey, slog.LevelKey и slog.MessageKey.
Если Handler выводит JSON, то вызов encoding/json.Unmarshal с `map[string]any` создаст правильную структуру данных.
Если Handler намеренно опускает атрибут, который проверяется тестом, то функция результатов должна проверить его отсутствие и добавить его в возвращаемую карту.
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/testing/slogtest/