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

时间:2010-09-28 11:17:13

标签: unit-testing

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

  1. 由于播放器是随机定位的,我无法确定经过一次的测试用例是否会再次通过。例如,它可以在大部分时间内通过,但如果玩家恰好位于障碍物前面则会失败。
  2. 我必须在一个测试用例中测试所有情况。例如,在测试玩家是否正确移动时,我必须检查是否存在障碍以及算法是否考虑过它。
  3. 我对此并不满意,但我没有看到出路。测试具有部分随机行为的方法是否可以接受?

6 个答案:

答案 0 :(得分:28)

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

如果你假装RNG,你可以测试如果它会自然地将玩家置于障碍物上会发生什么 - 它如何将玩家移开,等等。当然,这取决于知道班级如何使用RNG,但个人而言,我很高兴单元测试可以作为“白盒测试”,具有一些内部知识。

答案 1 :(得分:5)

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

答案 2 :(得分:3)

使随机源成为测试的输入,并将其配置为每次都相同。

几乎所有随机数生成器都采用“种子”值。通过每次提供相同的种子值,您可以知道您将获得相同的随机数序列,因此您的应用程序的输出应该完全相同。

  

我必须在一个测试用例中测试所有情况。

为什么呢?您可以拥有多个测试用例。您可以选择任意数量的不同和任意随机数种子来创建您要测试的条件。或者只是将特定位置的随机定位替换为测试目的。

答案 3 :(得分:2)

这里要测试两种不同的东西,你应该分别测试它们:

  • 程序逻辑是否适用于所有可能的起始位置?通过将玩家非随机定位在多个位置进行测试,试图涵盖所有“特殊情况”。
  • 随机定位实际上是随机的吗?通过多次调用定位逻辑进行测试,并进行某种统计分析。

答案 4 :(得分:1)

正如其他答案所说,随机算法是确定性的。如果使用相同的种子,则可以重现序列。

我必须处理非确定性代码的唯一情况是涉及多线程时。然后,您依赖于操作系统的调度程序。

在这些情况下,我将单元测试编写为循环,重复测试代码的数千次。

答案 5 :(得分:0)

根据测试理论,不可能测试随机行为:) 另一方面,正如之前的答案所述,对于您的测试,您可以以某种方式进行伪随机活动。