【问题标题】:Automated testing a game自动测试游戏
【发布时间】:2010-09-06 01:24:12
【问题描述】:

问题

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

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

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

简介

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

可能的答案

我的想法是这样的:

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

然后,创建一个简单的关卡,其中包含一些虚拟形象/用户可以与之交互的对象。从小处着手,随着更多交互的发展,将对象添加到关卡中。

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

【问题讨论】:

  • flea.sourceforge.net/gameTestServer.pdf 这是一个关于在游戏中实现成熟的功能测试器的有趣讨论。术语“单元测试”意味着正在测试“单元”。这是一回事。如果您正在进行更高级别的测试(例如同时进行多个系统),通常这称为功能测试。可以对游戏的大部分内容进行单元测试,但是您不能真正为了好玩而进行测试。只要您的测试可以是模糊的,确定性就不是必需的。例如。 “角色是否受伤”而不是“角色是否损失了 14.7 点生命值。
  • (对 stackoverflow.fail 感到抱歉。我已经有一段时间没来了!)
  • 当您谈论“单元测试”时,您的意思是“自动化测试”吗?
  • @Andrew,你是对的。我的意思是自动化测试。 /已编辑

标签: unit-testing automated-tests


【解决方案1】:

Riot Games 有一个 article 介绍如何对多人在线 RTS 游戏英雄联盟 (LoL) 进行自动化测试。

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

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

文章描述了一个拼写的单元测试示例:


设置
1.赋予角色能力。
2. 在中路(地图上的一个位置)生成一个敌方角色。
3. 在中路生成一个小兵。 (在英雄联盟的背景下,小兵是弱的不可控制的角色,是每个团队军队的一部分。他们基本上是经典饲料,是敌方团队的经验和金币来源。但如果不加以控制,他们可以压倒对方团队) 4. 将角色传送到中路。

执行
1. 拍摄所有变量的快照(例如玩家、敌人和普通角色的当前生命)。
2. 施法。
3. 激活敌方角色的法术效果(例如,有些法术会在击中时触发)。
4.重置法术的冷却时间,以便立即再次施放。
5. 施法。
6. 激活法术对小兵的影响(在英雄联盟中,大多数法术在小兵上使用时都有不同的计算)。 7. 再拍一张快照。

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


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

【讨论】:

    【解决方案2】:
    【解决方案3】:

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

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

    【讨论】:

    • 可能想要更改两场比赛的力量链接以指向从内部开始的游戏。 PO2G 不再托管有意义的内容。
    • Power of 2 Games 编写了 UnitTest++,可在 sourceforge.net/projects/unittest-cpp 获得。非常棒。
    【解决方案4】:

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

    这是一个关于在游戏中实现成熟的功能测试器的有趣讨论。

    术语“单元测试”意味着正在测试“单元”。这是一回事。如果您正在进行更高级别的测试(例如同时进行多个系统),通常这称为功能测试。可以对游戏的大部分内容进行单元测试,但您不能真正为了好玩而进行测试。

    确定性不是必需的,只要您的测试可以是模糊的。例如。 “角色是否受伤”而不是“角色是否损失了 14.7 点生命值。

    【讨论】:

      【解决方案5】:

      This postGames From Within 可能是相关的/有趣的。

      【讨论】:

      • 文章好像被删除了。 PO2G 现在看起来像一个链接垃圾邮件站点 :-(
      • 感谢升旗。 PO2G 倒闭了。然而,Noel Llopis 将所有博客内容移到了他在 Games From Within 的博客中。我已经相应地更新了链接。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            在开发的游戏性方面,值是如此随机,以至于测试绝对值将是一个牵强的想法

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

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

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-05-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-01-26
                • 1970-01-01
                • 2021-04-14
                相关资源
                最近更新 更多