Вы, конечно, не должны ставить его в тестовую функцию init()
.Зачем?Потому что порядок выполнения (или даже если выполняются тестовые функции) является недетерминированным.Подробнее см. Как последовательно запускать тесты golang?
Что это значит?
Если у вас есть 2 функции тестирования (например, TestA()
и TestB()
)обе из этих тестовых функций, которые вызывают в math/rand
, у вас нет гарантии, если сначала будет запущен TestA()
или TestB()
, или даже если будет вызвана какая-либо из них.И поэтому случайные данные, возвращаемые math/rand
, будут зависеть от этого порядка.
Лучшим вариантом было бы поместить начальное значение в TestA()
и TestB()
, но этого также может быть недостаточно, поскольку тесты могут выполняться параллельнопоэтому случайные данные, возвращаемые math/rand
, также могут быть недетерминированными.
Чтобы действительно иметь детерминированные результаты теста, функции, которым нужны случайные данные, должны получить значение math.Rand
и использовать это явно, и в тестах вы можете создавать отдельные, отличные math.Rand
значения, которые не будут использоваться другими тестами, так что, помещая их в постоянные значения и используя их в тестируемых функциях, только тогда вы сможете получить детерминированные результаты, которые будутне зависит от того, как и в каком порядке вызываются тестовые функции.