单元测试具有随机行为的方法

for*_*eal 22 unit-testing

我正在为我正在进行的游戏编写单元测试用例.当游戏开始时,玩家随机定位,我有两个问题:

  1. 由于播放器是随机定位的,我无法确定通过一次的测试用例是否会再次通过.例如,它可以在大部分时间通过,但如果玩家恰好位于障碍物前面则会失败.
  2. 我必须在一个测试用例中测试所有情况.例如,在测试玩家是否正确移动时,我必须检查是否存在障碍以及算法是否考虑过.

我对此并不满意,但我没有看到出路.测试具有部分随机行为的方法是否可以接受?

Jon*_*eet 29

我建议你将随机源(随机数生成器或其他)视为依赖.然后,您可以通过提供假RNG或具有已知种子的RNG来测试已知输入.这样可以消除测试中的随机性,同时将其保留在实际代码中.

如果你伪造RNG,你可以测试如果它会自然地将玩家置于障碍物上会发生什么 - 它如何将玩家移开,等等.当然,这取决于知道班级如何使用RNG,但我个人而言我很高兴单元测试充当了一些内部知识的"白盒测试".

  • @forceal - "技巧"是要意识到你现在没有测试随机性,而是测试你的代码对0到1之间的数字的响应. (6认同)
  • 效果很好!我创建了一个接口“ RNG”,该接口具有类似“ getRandomPlayerPosition()”和“ getRandomPlayerColor()”的方法。现在,我的游戏是使用RNG实例创建的。为了进行测试,它使用“ MockRNG”实现,该实现具有用于位置和颜色的设置方法。在生产中,它使用“ JavaRNG”,它使用Java的随机数机制返回值。 (2认同)

Gra*_*ton 5

您可以采取的一种方法是将随机位置生成拆分为单独的类/接口,以便您可以在测试中覆盖它,从而对其进行控制.