我建议覆盖随机函数。我在 PHP 中进行单元测试,所以我编写了以下代码:
// If we are unit testing, then...
if (defined('UNIT_TESTING') && UNIT_TESTING)
{
// ...make our my_rand() function deterministic to aid testing.
function my_rand($min, $max)
{
return $GLOBALS['random_table'][$min][$max];
}
}
else
{
// ...else make our my_rand() function truly random.
function my_rand($min = 0, $max = PHP_INT_MAX)
{
if ($max === PHP_INT_MAX)
{
$max = getrandmax();
}
return rand($min, $max);
}
}
然后我根据每次测试的需要设置 random_table。
测试随机函数的真实随机性完全是一个单独的测试。我会避免在单元测试中测试随机性,而是会进行单独的测试,并在您使用的编程语言中搜索随机函数的真正随机性。非确定性测试(如果有的话)应该被排除在单元测试之外。也许有一个单独的套件用于这些测试,这需要人工输入或更长的运行时间,以最大限度地减少失败的可能性,而这实际上是通过。