6

我想尝试使用 TDD 实现俄罗斯方块游戏。

根据我在阅读《Growing Object-Oriented Software, Guided by Tests 》时的理解,我应该从定义我的验收测试开始。如果我是对的,进行 TDD 时的验收测试就像用例一样定义。

定义一个好的第一个验收测试作为应用程序的“骨架”是非常重要的,所以它应该很简单。

我选择了以下 2 个验收测试作为我的第一个实施:

  1. 游戏开始,玩家关闭它。
  2. 游戏开始,玩家什么也不做。他最终输了。

这两个验收测试是好的开始测试吗?什么是好的下一个验收测试?我可以想到类似的东西

  • 游戏开始,只有方块掉落。玩家将它们全部放在这样的方式下,即线条总是“爆炸”,使得 100 个游戏步骤后的游戏仍未结束。

但我觉得这有点尴尬,因为在真正的俄罗斯方块游戏中,你总是会有不同的碎片掉下来,这就是验收测试应该做的。

此外,在执行 (2) 时,我有点想尝试一次性实现所有内容,我认为这不是在实现第二个验收测试时假装的。我想这个想法是只在其中 6-7 个之后才实施游戏,而不是在第二个。我对吗?

谢谢

4

3 回答 3

3

我会首先考虑游戏领域以及在丢弃一些定义块的帧之后它的样子。例如使用黄瓜

Scenario: dropping the first square
  Given an empty 10x2 field

  When a square is dropped at column 4
  And 48 frames have passed

  Then the field should contain a square at (4, 1)

  When 48 frames have passed
  Then the field should contain a square at (4, 2)

Scenario: Dropping a square on a full stack
  Given an empty 10x2 field
  And a square at (4, 2)

  When a square is dropped at column 4
  And 48 frames have passed

  Then the game should be over

如果您喜欢 Cucumber 功能规范的外观,您可能想尝试用于 .Net 的 Cuke4Nuke 或用于Java的Cuke4Duke 。

于 2010-07-24T11:52:03.323 回答
2

您将希望从测试中删除属于您的游戏的随机性。是的,这意味着测试并不能完美地复制游戏,但这也意味着您有可重复的测试,这具有更大的价值。隔离差异 - 将 PieceProvider 传递到您的游戏中;对于真正的游戏,传递一个 RandomPieceProvider,但对于测试,传递一个 SpecifiedPieceProvider。现在你在它们之间只有一点点差异,但差异应该小到无关紧要;您仍然可以满怀信心地测试游戏的所有其他方面。

于 2010-07-24T14:47:23.837 回答
0

从一个简单的块列表开始。假设没有玩家,积木将以某种方式堆积起来,然后溢出。如果块没有正确堆叠或程序未检测到溢出,您的测试将失败。

于 2010-07-24T07:05:44.283 回答