unit testing在游戏编程中是否可行?
我喜欢unit testing的想法,但是我很难将其应用于游戏编程。 游戏是高度有状态的,通常代码不会将自己分解成不同的单元。 根据我的经验,大多数函数都会改变状态,而不是返回值。
考虑像playerJump(height)
这样的简单动作。 我很想有一个testing套件来检查各种各样的案例,以确保跳跃始终按预期工作。 然而,这个函数可能不会返回任何值,并且具有player.velocity.y = -height
和checkCollisions(player)
。 我想不出一个明确的unit testing来构build这个。
unit testing在游戏等高度有状态的应用程序中是不可行的吗? unit testing的优点是如此之大,以至于值得在function上编程游戏呢?
更新:
来自Within的游戏有一系列关于在游戏中使用testing驱动开发的深度文章。 我强烈build议他们对这个问题感兴趣的人。 这是第一篇文章:
Stepping Through the Looking Glass: Test-Driven Game Development (Part 1)
代码通常不会将自己分解成不同的单元。
这只是糟糕的devise。 代码不会把自己分解成任何东西。 devise师必须在代码上强加一个结构,这样才能certificate它的实际工作。
但是,这个函数可能不会返回任何值…
所以?
…有副作用, player.velocity.y = -height
checkCollisions(player)
和checkCollisions(player)
。
然后testing一下。
我想不出一个明确的unit testing来构build这个。
为什么不? 你只是给出了一个很好的函数结果的规范。
您可能需要一些模拟对象来用简单的MockPlayerreplace成熟的播放器,这样更容易testing。
但是你的行为规范是完美的。 只要testing你描述的东西。
编程是编程。 unit testing对于任何types的应用程序都很有用,因为它们可以帮助您立即有效地检测和纠正错误(通常更重要的是,在重构代码时无意中引入的回归)。
当然,高级行为领域很难进行unit testing,但这并不是真正的unit testing,主要是为了检查单个方法或代码库的一小部分是否完成他们应该做的事情。
对于更高层次的行为,您需要应用其他testing方法(回归testing,例如:将固定顺序的input馈送到游戏中,然后检查每次获得相同的结果,或者在整个并检查他们总是生成相同的(或至less是一个相当相似的)图像)
PlayerJump的例子就是这种情况。 你可以用单位或者回归来testing,通过不断的input来隔离它(在一个简单的testing场景中以编程方式把玩家angular色放在一个固定的位置并且发起跳跃事件,然后检查他的碰撞或者最后的安置位置是否一致。玩家可以跳到“at”的不同物品库中,可以覆盖很多testing用例(例如跳跃超过规定的最大跳跃距离)。
除此之外,游戏确实需要大量的游戏testing(真正的用户只是在玩游戏)。 这会发现你没有用自动化testing覆盖的奇怪情况,但更重要的是它会回答自动化testing永远不会回答的问题:它是否“感觉”正确? 好玩吗”? 这些只是一个人可以进行的testing。
unit testing对于许多可能用于游戏代码的低级库非常有用,但是我严重怀疑它对于高层次的东西有很大的用处。 游戏通常是模拟和依赖大量的共享状态,不能有意义地被模拟和孤立地testing。 游戏中的function往往不会返回任何可以即时检查的价值,而是设定一个在未来某个时刻应该完成的运动过程。 testing这样的行为是值得的,但是需要一个截然不同的方法来单独testing代码片段的unit testing思路。
我在“孤岛危机2”开发过程中使用单元和自动化testing的经验可以在这里find:http: //yetanothergameprogrammingblog.blogspot.com/2010/06/aaa-automated-testing.html希望它有帮助。
概要:
自动化testing提高了可交付成果的稳定性,提高了内容创build者和工程师的工作效率自动化testing是提高代码质量,减less加class的几率的有效工具游戏行业整体上是非常反动的,不合理的论点反对不要称之为testing,把它称为别的东西,几乎其他任何东西(看行为驱动开发)要灵活,写出好的testing是困难的,并且需要在游戏行业没有广泛使用的技能
unit testing根本不关心你的单元是“有状态的”。 你有一个或多或less的自包含的代码,如果它的input和输出vector是巨大的,那么testing是困难的。 这些vector是否作为执行前后的状态放置,对testing没有任何影响。 如果你想告诉我们,你不能想象一个正确的方法来定义testing用例,比如在最简单的unit testing教程/论文中,也就是说testing主题是类似于“f(x)= y”的东西,那么是的,我同意,你将很难certificateless数(x [100],y [99])向量表示人类手杖具有足够的覆盖率(数字!)。 尝试制定综合性能和不variables,并进行自动化testing。
看看PEX自动化unit testing生成。 它将生成所有可能的inputvariables的unit testing,这将帮助您testing很多可能的组合。
许多游戏程序员使用实体组件系统架构 。 他们这样做是因为它更容易修改游戏对象的行为。 但是,碰巧它也使得unit testing代码更加容易。