【问题标题】:How can I write an effective test for game code with a while loop?如何使用 while 循环为游戏代码编写有效的测试?
【发布时间】:2019-01-27 18:03:01
【问题描述】:

我今天一直在用python写一个简单的连接四游戏。我打算对游戏进行全面的测试。

除了主游戏循环之外,我已经为我的所有方法编写了测试。我不确定如何为主游戏循环编写有效的测试。

在下面的函数中:

  • self.move 获取玩家的移动并将其放入棋盘;和

  • is_game_complete() 根据游戏是否完成返回一个布尔值。

以上两个都有有效的测试。

我不确定如何为以下内容编写有用的测试。测试合适吗?

def game_loop(self):
    while True:
        for active_player in self.players:
            self.move(active_player)
            if self.game_checker.is_game_complete():
                return active_player

我希望有一种编写测试的简洁方法,或者测试不太可能在这里有用。

非常感谢您的任何回复。

【问题讨论】:

  • 如果你已经验证了“.is_game_complete()”和“move()”,那么你是否没有在本质上验证过这个方法(假设game_loop的调用者不需要它或被验证过)。

标签: python unit-testing testing automated-tests


【解决方案1】:

你不应该用单元测试来测试游戏循环(太多的依赖来伪造)。它在这里没有用。如果您对self.move(active_player)is_game_complete() 进行了测试,那就足够了。你不可能有 100% 的测试覆盖率,尤其是在游戏开发中。

【讨论】:

    【解决方案2】:

    将您的代码分解成可测试的部分。

    首先,一个生成器生成可能无限的游戏状态流,但只能按需生成:

    def game_gen(self):
        for active_player in self.players:
            yield self.move(active_player)
    

    这需要self.move 返回被评估的东西,而不是简单地进行评估本身。这个东西也应该把活跃的玩家作为一个属性留待以后使用。

    接下来,编写一个使用游戏状态流的函数:

    def game_loop(self, stream):
        for move in stream:
            self.evaluate(move)  # Evaluate the move returned by self.move
            if self.game_checker.is_game_complete():
                return move.player  # The player that made the move
    

    现在您有两个可测试的部分。 game_gen 生成的项目可以一次测试一个,而无需在循环终止之前等待整个游戏播放完毕。 game_loop 不再隐式生成游戏;它会获取由game_gen 生成的一系列移动,或您自己创建的人工测试数据,以验证循环是否在必要时终止(或不终止)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2021-11-02
      相关资源
      最近更新 更多