1

免责声明 - 我尝试通过 google/stackoverflow 找到答案,但我不知道如何定义问题(我不知道正确的术语)

我有很多小的 AI 片段,如下所示。每个敌人类型都有一个._ai片段(如下所示),其中一个函数next()由主游戏循环中的有限状态机调用(仅供参考:该next函数不会在每次更新迭代时被调用,只有当敌人从队列)。

问题:我如何测试每个案例(考虑到一些敌人的 AI 片段可能更复杂,可能会出现千分之一的案例)并确保代码有效?

在下面的示例中,如果我blabla/1在 count++ 下添加了该行,则该错误可能很长时间都不会出现,因为 Javascript 解释器在遇到该特定路径之前不会捕获该错误。在编译语言中,添加诸如blabla/1会在编译时捕获的垃圾。

// AI Snippet
this._ai = (function(commands){
    var count = 0;

    return {
        next: function(onDone, goodies, baddies) {

            // If the internal counter reaches
            // 2, launch a super attack and 
            // reset the count
            if(count >= 2) {
                commands.super(onDone);
                count = 0;
            }
            else {
                // If not performing the super attack
                // there is a 50% chance of calling
                // the `attack` command
                if(chance(50)) {
                    var target = goodies[0];
                    commands.attack(onDone, target);
                } 
                // Or a 50% chance of calling the 
                // `charge` command
                else {
                    commands.charge(onDone);
                    count++;
                }
            }
        }
    };
})(this._commands); 

我可以装配随机生成器来返回一个值表,0-n并针对每个数字运行next1000 次。我只是不觉得那会具体告诉我每条路径都没有错误。

4

1 回答 1

1

正如您所说,单元测试必须测试每条路径,以便您确保一切正常。

但是您应该能够在测试中调用该方法之前确定该方法将遵循哪条路径,这样您就可以知道该方法的行为是否是预期的行为,以及是否有任何错误。

因此,例如,如果每 1000 次执行中只有一次会遵循一条路径,则您不需要测试所有 0、1、2 ... 999 个案例。您只有一种表现明显的结果组合。

例如,在显示的片段中,您有以下情况:

  • 计数器已达到 2
  • 计数器未达到 2 并且机会返回 true
  • 计数器未达到 2,机会返回 false

实现这一点的一种方法是通过模拟它们来控制计数器和机会方法。

如果您想知道当计数器达到 2 并调用 next 方法时会发生什么,只需传递一个带有 2 的计数器并调用 next。您不需要通过真正传递所有代码来达到柜台上的 2。

至于随机化器,在随机化器返回您要测试的值之前,您无需尝试。使其成为模拟并将其配置为根据每种情况的需要运行。

我希望这有帮助。

于 2013-08-31T08:49:17.677 回答