自动测试游戏

时间:2020-03-05 18:40:14  来源:igfitidea点击:

问题

我们将如何为游戏添加自动测试?

我相信我们可以对游戏引擎的许多功能(网络,对象创建,内存管理等)进行单元测试,但是可以自动测试实际游戏本身吗?

我不是在谈论游戏元素(例如Protoss在地图X中会击败Zerg),而是在谈论游戏和引擎之间的互动。

介绍

在游戏开发中,引擎只是游戏的平台。我们可以将游戏引擎视为一个操作系统,而将游戏视为可以运行该操作系统的软件。游戏可以是脚本的集合,也可以是游戏引擎中的实际子例程。

可能的答案

我的想法是这样的:

我们将需要确定性的引擎。这意味着给定一组输入,输出将完全相同。这将包括使用相同的输入来植入随机生成器。

然后,创建一个包含几个头像/用户可以与之交互的对象的准系统级别。从小处开始,然后在开发更多交互时将对象添加到关卡中。

创建一个遵循路径的脚本(测试寻路)并与不同的对象进行交互(存储结果或者预期的行为)。该脚本将是自动化测试。经过一段时间(例如一周)后,请运行脚本以及引擎的单元测试。

解决方案

回答

这并不能真正回答问题,但是我正在收听Microsoft上有关Pex的播客,该播客与我们提出的解决方案具有相似的功能,当我在听播客时,我记得我认为想看看是否它将能够测试游戏。我不知道它是否能够特别为我们提供帮助,但是也许我们可以看看他们使用的一些想法并将其应用于单元测试。

回答

Values are so random within the gameplay aspects of development that it would be a far fetched idea to test for absolute values

但是我们可以测试确定性值。例如,单元测试可能会使Guybrush Threepwood移至门(寻路),打开门(使用命令),失败,因为他的库存中没有钥匙(反馈),选择门钥匙(寻路+库存)管理),然后终于打开门。

所有这些路径都是确定性的。通过此单元测试,我可以重构内存管理器,如果它某种程度上破坏了库存管理例程,则单元测试将失败。

这只是游戏中单元测试的一个想法。我很想知道其他想法,因此,这篇文章的动机。

回答

内在游戏中的这篇文章可能是相关的/有趣的。

回答

我曾经做过与想法类似的事情,并且非常成功,尽管我怀疑它实际上更多地是系统测试而不是单元测试。正如我们建议的那样,随机数生成器必须使用相同的值作为种子,并且每次生成的序列都必须相同。
游戏以50hz的周期运行,因此计时不是问题。我有一个可以记录鼠标单击和位置的系统,并使用它来手动生成一个"脚本",可以对其进行重放以产生相同的结果。通过消除计时延迟并关闭图形生成,可以在几秒钟内复制一个小时的游戏时间。
最大的问题是对游戏设计的更改会使脚本无效。

如果准系统空间包含的逻辑与一般游戏无关,那么它可能会很好地工作。引擎可以在没有任何用户界面的情况下启动,并在初始化完成后立即启动脚本。沿途崩溃的测试很简单,但是更复杂的测试(例如将字符放置在正确的位置)将更加复杂。如果脚本的录制足够简单(就像在我的系统中一样),则可以非常轻松地对其进行更新,并且可以非常快速地设置用于测试特定行为的特殊脚本。我的系统的另一个优点是可以在游戏测试期间使用它,并且记录了确切的事件顺序,从而使错误修复更加容易。

回答

如果我们正在测试渲染引擎,我想我们可以渲染特定的测试场景,进行屏幕截图并将它们与参考测试渲染进行比较。这样,我们可以直观地检测引擎的变化是否破坏了任何东西。我们可以为声音引擎甚至动画编写类似的测试(通过比较一系列帧)。

如果要测试游戏逻辑或者场景进度,可以通过测试脚本变量的各种条件来实现(假设我们使用脚本来实现大多数场景和故事方面)。

回答

如果我们使用的是XNA(这个想法当然可以外推到其他框架),则可以使用游戏中的单元测试框架,该框架可让我们访问单元测试中的游戏状态。这样的框架就是Scurvy.Test :-)

回答

两个答案的力量中的一篇文章已经在另一个答案中提到过,但是我建议阅读其中的所有内容(或者几乎所有内容),因为它们的确写得很好,并且直接应用于游戏开发。关于Assert的文章特别好。我们也可以访问他们以前的网站,来自Games From Inside,其中有很多关于测试驱动开发的文章,这是极端的单元测试。

两个人的力量就是实现UnitCpp(一个相当受人尊敬的单元测试框架)的人。就个人而言,我更喜欢WinUnit。

回答

http://flea.sourceforge.net/gameTestServer.pdf

这是关于在游戏中实现功能完善的功能测试器的有趣讨论。

术语"单元测试"表示正在测试"单元"。这是一回事。如果我们要进行更高级别的测试(例如一次测试多个系统),通常称为功能测试。可以对游戏的大部分内容进行单元测试,但是我们并不能真正测试游戏的乐趣。

只要测试可能很模糊,就不需要确定性。例如。 "使角色受到伤害"与"使角色失去14.7生命值"相对。