tgoop.com/golang_digest/205
Last Update:
Тестирование конкурентного кода с помощью testing/synctest
https://go.dev/blog/synctest
Damien Neil из Go team рассказал про новый (экспериментальный) пакет testing/synctest для тестирования конкурентного кода, который доступе с версии Go 1.24
Экспериментальный — значит, он доступен только при GOEXPERIMENT=synctest
В чём суть:
Вместо ненадёжных sleep'ов и таймаутов для проверки асинхронных операций, пакет предлагает детерминированный подход. Весь тестируемый код выполняется в изолированном окружении - bubble. В этом окружении время виртуальное и продвигается только когда все горутины заблокированы. То есть, мы точно знаем, когда все горутины достигли точки блокировки с помощью Wait()
Никаких больше фейковых часов и моков time.Now() - всё работает из коробки.
При этом, у пакета всего два метода: synctest.Run()
и synctest.Wait()
Пример до:
// Классический подход с time.Sleep
func TestAfterFunc(t *testing.T) {
calledCh := make(chan struct{})
context.AfterFunc(ctx, func() {
close(calledCh)
})
// Ждем и надеемся...
time.Sleep(10 * time.Millisecond)
if called {
t.Fatal("called too early")
}
}
После:
// С synctest - детерминированно и без слипов
func TestAfterFunc(t *testing.T) {
synctest.Run(func() {
funcCalled := false
context.AfterFunc(ctx, func() {
funcCalled = true
})
synctest.Wait()
if funcCalled {
t.Fatal("called too early")
}
})
}
#go_official #go_experimental
BY Golang Дайджест

Share with your friend now:
tgoop.com/golang_digest/205