💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат и результаты по 6 тематическим шкалам с объяснениями и практическими рекомендациями.
Вопрос 2 из 30
В рабочем примере по теме «Пакет testing» важно отделить гарантию от догадки. Как подготовить этот код к реальному использованию?
Go Пакет testing: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package sample
import "testing"
func assertEqual(t *testing.T,a,b int){t.Helper();if a!=b{t.Fatalf("%d != %d",a,b)}}
func TestX(t *testing.T){assertEqual(t,2,2)}
Создавать локальную копию данных случая там, где версия языка или форма цикла допускает захват изменяемой переменной.
Добавлять граничные и ошибочные случаи, давать имена по поведению, а не `case1`.
Определять контракт со стороны потребителя и использовать простую ручную заглушку для нескольких методов.
Останавливать тест через `Fatal` только когда дальнейшие проверки не имеют смысла, иначе собирать несколько независимых ошибок.
Проверять `nil`-получатель только если методы типа действительно обещают осмысленное поведение для `nil`.
Вопрос 3 из 30
Фрагмент относится к теме «Пакет testing». Какой контракт определяет результат показанного кода?
Go Пакет testing: проверка контракта Копировать
// Определите правило Go, которое объясняет результат.
package sample
import "testing"
func assertEqual(t *testing.T,a,b int){t.Helper();if a!=b{t.Fatalf("%d != %d",a,b)}}
func TestX(t *testing.T){assertEqual(t,2,2)}
Таблица объединяет вход, ожидаемый результат и имя случая; каждый случай должен быть самостоятельным и читаемым.
`t.Run` создаёт именованный подтест; после `t.Parallel` он продолжает параллельно только после приостановки родительской последовательной части.
Комментарий экспортированного имени объясняет назначение, контракт, ошибки и конкурентную безопасность, а не повторяет сигнатуру.
Лучше подменять узкую зависимость через интерфейс или функцию, чем имитировать весь внешний пакет.
Тестовая функция имеет сигнатуру `func TestX(*testing.T)`; `t.Helper` переносит место ошибки к вызывающему помощнику.
Вопрос 6 из 30
В рабочем примере по теме «Табличные сценарии» важно отделить гарантию от догадки. Что гарантированно произойдёт в показанной последовательности операций?
Go Табличные сценарии: результат выполнения Копировать
// Фрагмент для трассировки.
package sample
import "testing"
func TestAbs(t *testing.T){cases:=[]struct{name string;in,want int}{{"negative",-2,2},{"zero",0,0},{"positive",3,3}};for _,tc:=range cases{t.Run(tc.name,func(t *testing.T){got:=tc.in;if got<0{got=-got};if got!=tc.want{t.Fatal(got)}})}}
Каждый случай получает отдельное имя и отчёт, а параллельные случаи не должны делить изменяемый вход.
Ошибка из `assertEqual` указывает на строку теста после вызова `t.Helper()`, а не на внутреннюю строку помощника.
Перевод между счетами защищает проверку остатка и обе записи одной парой блокировок.
Цикл запускает три набора одной функции без копирования логики проверки.
Функция времени инъецируется полем и в тесте возвращает фиксированный момент.
Вопрос 7 из 30
Фрагмент относится к теме «Табличные сценарии». Какой вариант исправления соответствует обычной практике Go?
Go Табличные сценарии: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package sample
import "testing"
func TestAbs(t *testing.T){cases:=[]struct{name string;in,want int}{{"negative",-2,2},{"zero",0,0},{"positive",3,3}};for _,tc:=range cases{t.Run(tc.name,func(t *testing.T){got:=tc.in;if got<0{got=-got};if got!=tc.want{t.Fatal(got)}})}}
Определять контракт со стороны потребителя и использовать простую ручную заглушку для нескольких методов.
Создавать локальную копию данных случая там, где версия языка или форма цикла допускает захват изменяемой переменной.
Останавливать тест через `Fatal` только когда дальнейшие проверки не имеют смысла, иначе собирать несколько независимых ошибок.
Использовать встраивание для композиции поведения, а не для имитации наследования и неявной подстановки типов.
Добавлять граничные и ошибочные случаи, давать имена по поведению, а не `case1`.
Вопрос 8 из 30
На ревью разбирают тему «Табличные сценарии». Какой принцип языка объясняет результат полностью?
Go Табличные сценарии: проверка контракта Копировать
// Определите правило Go, которое объясняет результат.
package sample
import "testing"
func TestAbs(t *testing.T){cases:=[]struct{name string;in,want int}{{"negative",-2,2},{"zero",0,0},{"positive",3,3}};for _,tc:=range cases{t.Run(tc.name,func(t *testing.T){got:=tc.in;if got<0{got=-got};if got!=tc.want{t.Fatal(got)}})}}
Таблица объединяет вход, ожидаемый результат и имя случая; каждый случай должен быть самостоятельным и читаемым.
Лучше подменять узкую зависимость через интерфейс или функцию, чем имитировать весь внешний пакет.
Тестовая функция имеет сигнатуру `func TestX(*testing.T)`; `t.Helper` переносит место ошибки к вызывающему помощнику.
Ошибка — значение, обычно возвращаемое отдельным результатом; `errors.New` подходит для постоянного сообщения без форматирования.
`t.Run` создаёт именованный подтест; после `t.Parallel` он продолжает параллельно только после приостановки родительской последовательной части.