我正在为我正在进行的游戏编写单元测试用例。当游戏开始时,玩家随机定位,我有两个问题:
我对此并不满意,但我没有看到出路。测试具有部分随机行为的方法是否可以接受?
答案 0 :(得分:28)
我建议您将随机源(随机数生成器或其他)视为依赖项。然后,您可以通过提供假RNG或具有已知种子的RNG来测试已知输入。这样可以消除测试中的随机性,同时将其保留在实际代码中。
如果你假装RNG,你可以测试如果它会自然地将玩家置于障碍物上会发生什么 - 它如何将玩家移开,等等。当然,这取决于知道班级如何使用RNG,但个人而言,我很高兴单元测试可以作为“白盒测试”,具有一些内部知识。
答案 1 :(得分:5)
您可以采取的一种方法是将随机位置生成拆分为单独的类/接口,以便您可以在测试中覆盖它,从而控制它。
答案 2 :(得分:3)
使随机源成为测试的输入,并将其配置为每次都相同。
几乎所有随机数生成器都采用“种子”值。通过每次提供相同的种子值,您可以知道您将获得相同的随机数序列,因此您的应用程序的输出应该完全相同。
我必须在一个测试用例中测试所有情况。
为什么呢?您可以拥有多个测试用例。您可以选择任意数量的不同和任意随机数种子来创建您要测试的条件。或者只是将特定位置的随机定位替换为测试目的。
答案 3 :(得分:2)
这里要测试两种不同的东西,你应该分别测试它们:
答案 4 :(得分:1)
正如其他答案所说,随机算法是确定性的。如果使用相同的种子,则可以重现序列。
我必须处理非确定性代码的唯一情况是涉及多线程时。然后,您依赖于操作系统的调度程序。
在这些情况下,我将单元测试编写为循环,重复测试代码的数千次。
答案 5 :(得分:0)
根据测试理论,不可能测试随机行为:) 另一方面,正如之前的答案所述,对于您的测试,您可以以某种方式进行伪随机活动。