我正在使用 PHPUnit,我的传统方法是使用由我正在测试的方法调用的模拟对象和方法。模拟对象被告知单元测试的输入期望是什么。问题是提供给模拟对象的部分输入是由正在测试的方法随机生成的(并且单元测试无法知道它们是什么)。
只是想知道是否有人可以提出解决方案。
我正在使用 PHPUnit,我的传统方法是使用由我正在测试的方法调用的模拟对象和方法。模拟对象被告知单元测试的输入期望是什么。问题是提供给模拟对象的部分输入是由正在测试的方法随机生成的(并且单元测试无法知道它们是什么)。
只是想知道是否有人可以提出解决方案。
不知道您的具体情况很难说,但也许您可以重构以将一些随机数提供程序注入您的测试对象。在测试期间,您可以使用硬编码的随机数种子来获得可重现的结果。
如果你有一张预期结果的地图,并且你从密钥集中随机抽取,你可以有一定程度的随机性,并且仍然能够预测预期结果是什么。
可以将“随机部分”注入方法中(或者随机性是核心特征)吗?
例如(可能是一个过于简单的例子,从字面上理解“随机”)而不是
function foo($x, $y) {
return $x * rand(1, $y);
}
使用类似的东西
function foo($x, $r) {
return $x * $r->getNext();
}
通过这种方式,您可以在测试中尽可能多地消除“随机性”,因为您可以为 $r 传递一个对象,该对象并不真正返回随机值,而是例如边缘情况。
我一直认为单元测试是可重复的。(我的意思是每次运行都表现相同并给出相同的结果)。
单元测试还有其他先决条件,但对我来说,这是最重要的。(看看这个非常好的定义)
鉴于此,看起来不可能测试你的具体情况。
我会尝试将您的代码的随机内容分成特定部分。然后,我会将其视为数据源,因此我也会尝试模拟它。
我希望你能把它应用到你的上下文中。
您不必使用对其输入严格的模拟 - 只有在它为测试增加价值时才这样做。
在其他情况下,使用存根,它不关心他们的输入,或者有一些严格的方法和一些松散的方法。