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

时间:2019-01-27 18:03:02

标签: python unit-testing testing automated-tests

我今天一直在用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

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

非常感谢您的任何答复。

2 个答案:

答案 0 :(得分:1)

您不应该使用单元测试来测试游戏循环(过多的依赖导致伪造)。在这里没有用。如果您已经测试了self.move(active_player)is_game_complete(),那就足够了。您不能拥有100%的测试覆盖率,尤其是在游戏开发中。

答案 1 :(得分:1)

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

首先,一个生成器可能会产生无限量的游戏状态,但仅在需要时才会生成:

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产生的一系列移动,或者是您自己创建的人工测试数据,以验证循环是否根据需要终止(或不终止)。