Golang Дайджест
8.04K subscribers
36 photos
1 file
170 links
Самое интересное из мира Go: новости, статьи, проекты, сервисы, изменения в языке и др.

Посты публикуются не часто - только самое важное, с чем я лично ознакомился.

Поэтому можно не мьютить канал =)

Обратная связь: @justskiv
Download Telegram
Тестирование конкурентного кода с помощью 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
👍20🔥19