免责声明 - 我尝试通过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次。我只是觉得这不会具体告诉我每条路径都没有错误。
答案 0 :(得分:1)
正如您所说,单元测试必须测试每条路径,以确保一切正常。
但是你应该能够在测试之前决定该方法将遵循哪条路径,这样你就能够知道方法行为是否是预期的,以及是否有任何错误。
因此,举例来说,如果每1000次执行中只有一次会有一条路径,则不需要测试所有0,1,2 ... 999个案例。您只有一种表现明显的结果组合。
例如,在显示的代码段中,您有以下情况:
实现这一目标的一种方法是通过嘲笑控制计数器和机会方法。
如果你想知道当计数器达到2并且调用下一个方法时会发生什么,只需传递一个带2的计数器然后调用next。通过真正传递所有代码,你不需要在柜台上达到2。
对于randomizer,您无需尝试,直到randomizer返回您要测试的值。将它设为模拟并将其配置为根据您的需要为每种情况设置。
我希望这会有所帮助。