编写单元测试具有一定程度随机化的方法

时间:2009-10-17 18:36:33

标签: php unit-testing testing phpunit

我正在使用PHPUnit,而我的传统方法是使用我正在测试的方法调用的模拟对象和方法。模拟对象被告知单元测试的输入结果。问题是提供给模拟对象的部分输入是由被测试的方法随机生成的(并且单元测试无法知道它们是什么)。

只是想知道是否有人可以提出解决方案。

5 个答案:

答案 0 :(得分:2)

在不知道具体情况的情况下很难分辨,但也许你可以重构一些随机数提供者到你测试的对象中。在测试期间,您可以使用硬编码的随机数种子来获得可重现的结果。

答案 1 :(得分:2)

如果您有预期结果的地图,并且您从关键字集中随机抽取,则可以具有一定程度的随机性,并且仍然能够预测预期结果是什么。

答案 2 :(得分:2)

可以将“随机部分”注入到方法中(或者是随机 核心功能)吗?

E.g。 (也许是一个过于简单的例子,字面意思是“随机”)而不是

function foo($x, $y) {
  return $x * rand(1, $y);
}

使用类似

的内容
function foo($x, $r) {
  return $x * $r->getNext();
}

通过这种方式,您可以在测试中消除尽可能多的“随机性”,因为您可以为$ r传递一个并不真正返回随机值的对象,例如边缘情况。

答案 3 :(得分:1)

我一直认为单元测试是可重复的。 (我的意思是每次运行都表现相同并给出相同的结果) 单元测试还有其他前提条件,但对我来说,它是最重要的一个。 (看看this very good definition

鉴于此,可能无法测试您的具体情况 我会尝试将代码的随机内容分成特定部分。然后,我会将其视为数据源,因此我也会尝试模拟它。

我希望你能将它应用到你的背景中。

答案 4 :(得分:0)

您不必使用对其输入严格的模拟 - 只有在为测试增加价值时才这样做。

在其他情况下,使用存根,它们不关心它们的输入,或者有些方法是严格的,有些方法是必要的。