如何使用while循环为游戏代码编写有效的测试?

2024-03-29 14:07:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我今天一直在用python编写一个简单的connect-four游戏。我打算对比赛进行全面的测试。你知道吗

除了主游戏循环外,我还为我的所有方法编写了测试。我不确定如何为主游戏循环编写有效的测试。你知道吗

在以下函数中:

  • 你知道吗自行移动获取玩家的移动并将其放入游戏板;并且

  • is\u game \u 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

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

非常感谢您的回复。你知道吗


Tags: 方法函数selfloopgame游戏isdef
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生成的一系列移动,或者您自己创建的人工测试数据,以验证循环是否在必要时终止(或不终止)。你知道吗

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

相关问题 更多 >