В #go тесты работают таким образом: программист делает файлы, имя которых оканчивается на
_test.go, и внутри пишет функции вида:func TestXxx(*testing.T)
(префикс
Test обязателен), а команда go test автоматически эти тесты подхватывает и исполняет. Тип testing.T позволяет организовывать тесты: логгировать, запускать подтесты и досрочно прерывать тесты, как ошибочные.К чему я это? В последней версии Go — Go 1.26.0, вышедшей 10 февраля — есть несколько изменений. Одно из них — у кучи функций из подпакетов пакета
crypto описаны изменения в духе "функция для генерации ключей теперь игнорирует аргумент, переданный для генерации случайности, и использует криптографически безопасный источник случайности". Разумеется, для тестов желательна воспроизводимость. Но как этого добиться, если источник случайности игнорируется?Для решения этого вопроса Go предлагает два решения.
Первое — это GODEBUG,
cryptocustomrand=1. Настройки через GODEBUG не вечные и могут быть убраны в одном из будущих релизов. По этой причине этот способ выглядит не особо привлекательным.Второе — это использовать новую функцию testing/cryptotest.SetGlobalRandom. Она устанавливает сид для источника случайности, который будет использоваться для всех криптографических функций из пакета
crypto, полагающихся на случайные данные. Эти изменения действуют в пределах одного теста, запускаемого testing.T. Соответственно, для каждого теста, который желает воспроизводимости, эту функцию нужно вызывать явно в начале. Разумеется, как справедливо отмечено в документации,Because SetGlobalRandom affects the whole process, it cannot be used in parallel tests or tests with parallel ancestors.
Воистину concurrent programming language!