我正在玩一个小游戏项目,由于我在TDD方面经验不足,因此我希望能得到一些专家对几件事情的意见。
首先,我很早就意识到TDD似乎并不适合游戏开发。关于这个问题,意见似乎相当分歧。我的最初的无知看法是,TDD似乎非常适合所有游戏逻辑。我自认为任何处理视频输出和声音的东西都会被抽象成类,并进行视觉测试。
事情开始顺利。目标是创建一个2D太空飞行游戏(对于那些关心的人来说是类似于《小行星》的游戏)。我为Ship类创建了一系列单元测试。像初始化、旋转等东西可以很容易地进行测试,例如: GetRotation(),TurnRotateRightOn(),Update(1),GetRotation(),Expect_NE(rotation1, rotation2)。然后我遇到了第一个问题。
我对TDD的理解是,你应该按照你认为应该使用类的方式编写测试。我想让飞船移动,所以我编写了一个基本上是这样的类。GetCoordinates(),ThrustOn(),Update(1),GetCoordinates()。这样做没问题,可以确保飞船移动到某个地方。然而,我很快意识到我必须确保飞船朝着正确的方向以正确的速度移动。接下来是一个75行的单元测试,基本上我必须初始化旋转、检查坐标、初始化推力、更新飞船、获取新坐标、检查新旋转。更重要的是,我看不出在游戏中有必要获得飞船的速度(只需要坐标,飞船应该自己更新)。因此,我没有直接获取速度的方法。所以测试基本上必须重新计算速度应该是多少,以便我可以确保它与更新后获取的坐标相匹配。总之,这非常混乱,非常耗时,但起作用了。测试失败,使测试通过,等等。
这很好,直到后来我意识到我想将飞船的更新代码重构为抽象的“Actor”类。我意识到,虽然每个Actor子类都需要能够正确计算新位置,但并不是每个子类都必须以相同的方式更新其速度(一些碰撞,一些不碰撞,一些具有静态速度)。现在,我基本上面临着复制和修改那个庞大的测试代码的前景,我不能不想到应该有更好的方法。
有没有人有处理单元测试这种复杂的黑盒类型工作的经验?看起来我基本上必须在测试中编写完全相同的物理代码,以便我知道结果应该是什么。这似乎是自我毁灭的,我肯定在某个地方错过了所有这些的要点。如果有人能提供任何帮助或建议,我将非常感激。