2

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

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

4

5 回答 5

2

不知道您的具体情况很难说,但也许您可以重构以将一些随机数提供程序注入您的测试对象。在测试期间,您可以使用硬编码的随机数种子来获得可重现的结果。

于 2009-10-17T18:40:22.273 回答
2

如果你有一张预期结果的地图,并且你从密钥集中随机抽取,你可以有一定程度的随机性,并且仍然能够预测预期结果是什么。

于 2009-10-17T18:47:10.067 回答
2

可以将“随机部分”注入方法中(或者随机性核心特征)吗?

例如(可能是一个过于简单的例子,从字面上理解“随机”)而不是

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

使用类似的东西

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

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

于 2009-10-17T18:47:10.247 回答
1

我一直认为单元测试是可重复的。(我的意思是每次运行都表现相同并给出相同的结果)。
单元测试还有其他先决条件,但对我来说,这是最重要的。(看看这个非常好的定义

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

我希望你能把它应用到你的上下文中。

于 2009-10-17T18:51:39.737 回答
0

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

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

于 2009-10-17T18:40:44.783 回答