Случайное число семян для юнит-тестов в Голанге - PullRequest
0 голосов
/ 02 июня 2018

У меня есть функции, которые используют math/rand для «случайной» выборки из Пуассона и другой из биномиального распределения.Он часто используется другими функциями, которые также возвращают случайные значения, такие как h(g(f())), где f() g() и h() являются случайными функциями.

Я поместил вызов rand.Seed(n) в main(), чтобы выбрать другое начальное число при каждом запуске программы, и она работает нормально.

Мой вопрос касается юнит-тестов для этих функций PRNG ифункции, которые используют их, используя встроенный пакет testing.Я хотел бы удалить случайность, чтобы иметь предсказуемое значение для сравнения.

Где лучше всего разместить мое начальное значение для получения детерминированного результата?В init () тестового файла или внутри каждой тестовой функции, или где-то еще?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

В качестве альтернативы передаче math.Rand вы можете сделать обезьяньё исправление ЕСЛИ , если вы не хотите, чтобы внедрение зависимостей было частью API вашего пакета, например: https://play.golang.org/p/cIGxhO0wSbo

0 голосов
/ 02 июня 2018

Вы, конечно, не должны ставить его в тестовую функцию init().Зачем?Потому что порядок выполнения (или даже если выполняются тестовые функции) является недетерминированным.Подробнее см. Как последовательно запускать тесты golang?

Что это значит?

Если у вас есть 2 функции тестирования (например, TestA() и TestB())обе из этих тестовых функций, которые вызывают в math/rand, у вас нет гарантии, если сначала будет запущен TestA() или TestB(), или даже если будет вызвана какая-либо из них.И поэтому случайные данные, возвращаемые math/rand, будут зависеть от этого порядка.

Лучшим вариантом было бы поместить начальное значение в TestA() и TestB(), но этого также может быть недостаточно, поскольку тесты могут выполняться параллельнопоэтому случайные данные, возвращаемые math/rand, также могут быть недетерминированными.

Чтобы действительно иметь детерминированные результаты теста, функции, которым нужны случайные данные, должны получить значение math.Randи использовать это явно, и в тестах вы можете создавать отдельные, отличные math.Rand значения, которые не будут использоваться другими тестами, так что, помещая их в постоянные значения и используя их в тестируемых функциях, только тогда вы сможете получить детерминированные результаты, которые будутне зависит от того, как и в каком порядке вызываются тестовые функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...