Тесты конкурентного кода часто либо долго выполняются из-за реального времени, либо флакают из-за гонок.
В Go 1.25 появился стабильный testing/synctest, который позволяет запускать тест в изолированном bubble с виртуальным временем.
func TestTimeout(t *testing.T) {
synctest.Test(t, func(t *testing.T) {
ctx, cancel := context.WithTimeout(
context.Background(),
time.Hour,
)
defer cancel()
<-ctx.Done()
if ctx.Err() != context.DeadlineExceeded {
t.Fatal("timeout did not expire")
}
})
}
Час здесь не проходит в реальном времени: когда все горутины заблокированы, виртуальные часы автоматически перемещаются к следующему событию.
А synctest.Wait() позволяет дождаться, пока конкурентная работа в bubble завершится или перейдёт в состояние ожидания.
📌 synctest был экспериментом в Go 1.24, а с Go 1.25 входит в стандартную библиотеку.
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction


