自动测试游戏

时间:2008-08-18 01:44:57

标签: unit-testing automated-tests

问题

您如何为游戏添加自动化测试?

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

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

简介

在游戏开发中,引擎只是游戏的平台。您可以将游戏引擎视为操作系统,将游戏视为操作系统运行的软件。游戏可以是游戏引擎内的脚本集合或实际子程序。

可能的答案

我的想法是:

您需要一个确定性的引擎。这意味着给定一组输入,输出将完全相同。这将包括随机生成器播种相同的输入。

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

创建一个跟踪路径的脚本(测试路径查找)并与不同的对象交互(存储结果或预期的行为)。这个脚本将是您的自动化测试。经过一段时间(比如一周)后,运行脚本以及引擎的单元测试。

10 个答案:

答案 0 :(得分:8)

This post上的{p> Games From Within可能相关/有趣。

答案 1 :(得分:2)

  

在开发的游戏玩法方面,值是如此随机,以至于测试绝对值是一个遥不可及的想法

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

所有这些路径都是确定性的。通过这个单元测试,我可以重构内存管理器,如果它以某种方式打破了库存管理例程,单元测试就会失败。

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

答案 2 :(得分:2)

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

如果您的准系统房间包含独立于一般游戏的逻辑,那么它可以很好地工作。引擎可以在没有任何ui的情况下启动,并在初始化完成后立即启动脚本。沿途的碰撞测试很简单,但更复杂的测试,例如将角色留在正确的位置会更复杂。如果脚本的记录足够简单,它们在我的系统中,那么它们可以非常容易地更新,并且可以非常快速地设置用于测试专门行为的特殊脚本。我的系统具有额外的优势,它可以在游戏测试期间使用,并记录事件的确切顺序,以便更容易修复错误。

答案 3 :(得分:2)

来自Power of Two GamesGames From Within的文章已在另一个答案中提到,但我建议阅读那里的所有内容(或几乎所有内容),因为它们都写得非常好并直接应用于游戏开发。 article on Assert特别好。您还可以访问他们之前的网站Games From Within,该网站上有很多关于Test Driven Development的文章,这是一个极端的单元测试。

两个人的力量是实施UnitCpp的人,这是一个备受好评的单元测试框架。 Personally, I prefer WinUnit

答案 4 :(得分:2)

Riot Games对于使用多人在线RTS游戏的英雄联盟(LoL)进行自动化测试article

根据开发人员的说法,每天游戏代码和游戏平衡都有很多变化。他们构建了一个Python测试框架,它基本上是一个更简单的游戏客户端,它将命令发送到运行LoL游戏服务器实例的Continuous Integration服务器。然后,服务器向测试框架发送命令的效果,允许测试响应。

框架提供了一个事件队列,用于记录特定时间点的事件,数据和效果。这篇文章称之为"快照"。

文章描述了一个单位测试的例子:

<强>设置
1.赋予角色能力 2.在midlane(地图上的某个位置)产生敌人角色 3.在midlane中产生蠕变。 (在LoL的背景下,小兵是弱小的不可控制的角色,是每个团队的一部分。他们基本上都是经典的饲料,是敌人队伍的经验和黄金的来源。但如果不加以控制,他们会可以压倒对方球队) 4.将角色传送到中途。

<强>执行
1.拍摄所有变量的快照(例如玩家当前的生命,敌人和普通人物) 2.施放咒语 3.激活一个敌人角色的法术效果(例如,有一些法术会在命中时触发)。
4.重置法术的冷却时间,以便立即重新施法 5.施放咒语。
6.激活法术对蠕变的效果(在LoL的情况下,大多数法术在小兵上使用时都有不同的计算)。 7.拍摄另一张快照。

验证
从第一个快照开始,重放事件,并声明预期结果(从游戏设计者的角度来看)是正确的。可以验证的事件示例包括:伤害在法术伤害的范围内(LoL使用随机数给予攻击变化),与玩家角色和蠕变相比,伤害被适当抵抗,并且法术在其有效范围内施放。

文章显示,当从普通游戏客户端查看测试服务器时,可以提取测试视频。

答案 5 :(得分:1)

如果您正在测试渲染引擎,我猜您可以渲染特定的测试场景,进行屏幕捕获并将它们与参考测试渲染进行比较。这样,您可以直观地检测引擎中的更改是否会破坏任何内容。您可以为声音引擎甚至动画编写类似的测试(通过比较一系列帧)。

如果您想测试游戏逻辑或场景进度,可以通过测试脚本变量的各种条件来做到这一点(假设您使用脚本来实现大部分场景和故事方面)。

答案 6 :(得分:1)

如果你正在使用XNA(当然这个想法可以推广到其他框架),你可以使用游戏中的单元测试框架,让你在单元测试中访问游戏的状态。其中一个框架是Scurvy.Test: - )

答案 7 :(得分:1)

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

这是一个关于在游戏中实现功能齐全的功能测试人员的有趣讨论。

术语“单元测试”意味着正在测试“单元”。这是一回事。如果您正在进行更高级别的测试(例如,同时使用多个系统),通常这称为功能测试。可以对游戏的大部分进行单元测试,但是你无法真正测试它的乐趣。

只要您的测试可能模糊,确定性就没有必要了。例如。 “这个角色受伤了”,而不是“这个角色失去了14.7个生命值。

答案 8 :(得分:1)

答案 9 :(得分:0)

这并没有真正回答你的问题,但是我正在听Pex from microsoft上的播客,它与你提出的解决方案做了类似的事情,当我听到它的时候,我记得我认为它会是真的很有趣,看看它是否能够测试游戏。我不知道它是否能够专门为您提供帮助,但也许您可以查看他们使用的一些想法并将其应用到您的单元测试中。