Чтобы понять, что решает synctest
, мы должны сначала рассмотреть основную проблему: недетерминизм в конкурентных тестах.
func TestSharedValue(t *testing.T) {
var shared atomic.Int64
go func() {
shared.Store(1)
time.Sleep(1 * time.Microsecond)
shared.Store(2)
}()
// Проверяем общее значение через 5 микросекунд
time.Sleep(5 * time.Microsecond)
if shared.Load() != 2 {
t.Errorf("shared = %d, want 2", shared.Load())
}
}
Этот тест запускает горутину, которая изменяет общую переменную. Она устанавливает shared
в 1, спит 1 микросекунду, а затем устанавливает её в 2.
Тем временем основная функция теста ждёт 5 микросекунд перед проверкой того, достигло ли shared
значения 2. На первый взгляд кажется, что этот тест должен всегда проходить. В конце концов, 5 микросекунд должно быть достаточно времени для завершения выполнения горутины.
Однако...
Читать дальше →