测试/验证/评估函数中每个路径的结果?

时间:2013-08-26 11:28:22

标签: javascript unit-testing

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

我有很多小的AI片段,如下所示。每个敌人类型都有一个._ai代码段(如下所示),其中一个函数next()由主游戏循环中的有限状态机调用(fyi:next函数没有'只有当敌人从队列中移出时才会调用每次更新迭代。

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

在下面的示例中,如果我在count ++下添加了行blabla/1,则错误可能不会长时间被删除,因为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的值表,并针对每个数字运行next 1000次。我只是觉得这不会具体告诉我每条路径都没有错误。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

实现这一目标的一种方法是通过嘲笑控制计数器和机会方法。

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

对于randomizer,您无需尝试,直到randomizer返回您要测试的值。将它设为模拟并将其配置为根据您的需要为每种情况设置。

我希望这会有所帮助。