💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат и результаты по 5 тематическим шкалам с объяснениями и практическими рекомендациями.
Вопрос 22 из 25
Команда проверяет решение по теме «Тестирование и наблюдаемость» в тесте «Интерфейсы io.Reader и io.Writer». Как подготовить этот код к реальному использованию?
Go Тестирование и наблюдаемость: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package sample
import("io";"strings";"testing";"testing/iotest")
func TestRead(t *testing.T){ r:=iotest.OneByteReader(strings.NewReader("abc")); b,err:=io.ReadAll(r); if err!=nil||string(b)!="abc"{t.Fatal(string(b),err)} }
Инъецировать часы или длительности в код с большим числом временных сценариев, чтобы тесты не зависели от реального ожидания.
Использовать `iotest` и собственные маленькие заглушки, измерять число байтов и длительность без записи содержимого секретных потоков.
Использовать барьеры вместо сна, запускать `-race` и отслеживать число горутин до и после серии операций.
Добавлять нагрузочные тесты, `-race` и снимки горутин при зависании; число сообщений в очереди использовать только как метрику.
Записывать метод, хост, статус, длительность и категорию ошибки, не превращая URL с идентификаторами в метки высокой кардинальности.
Вопрос 23 из 25
Перед публикацией кода по теме «Тестирование и наблюдаемость» нужно уточнить контракт в тесте «Интерфейсы io.Reader и io.Writer». Какой контракт определяет результат показанного кода?
Go Тестирование и наблюдаемость: проверка контракта Копировать
// Определите правило Go, которое объясняет результат.
package sample
import("io";"strings";"testing";"testing/iotest")
func TestRead(t *testing.T){ r:=iotest.OneByteReader(strings.NewReader("abc")); b,err:=io.ReadAll(r); if err!=nil||string(b)!="abc"{t.Fatal(string(b),err)} }
Потоковый код тестируют читателями, которые дробят данные, возвращают ошибки после байтов и выполняют короткие записи.
Слой данных тестируют на ошибках начала, запроса, сканирования и коммита; отдельно нужен интеграционный тест реальной базы.
Протокол канала тестируют на обычном пути, закрытии, отмене и отсутствии потребителя; зависание ограничивают таймаутом теста.
Перед выпуском нужны модульные, интеграционные и нагрузочные проверки критических путей, а после — контролируемое наблюдение новых ошибок и задержки.
Обобщённый алгоритм тестируют представителями разных ветвей ограничения и именованными типами, а не только `int`.