Как я могу написать эффективный тест для игрового кода с циклом while? - PullRequest
0 голосов
/ 27 января 2019

Сегодня я пишу простую игру «Соединяй четыре» на python.Я намерен провести в игре всесторонние тесты.

Я написал тесты для всех моих методов, кроме основного игрового цикла.Я не уверен, как написать эффективный тест для основного игрового цикла.

В следующей функции:

  • self.move получает ход игрока и кладет его на игровое поле;и

  • is_game_complete () возвращает bool в зависимости от того, завершена ли игра.

Оба из перечисленных имеют эффективные тесты.

Я не уверен, как написать полезный тест для ниже.Подходит ли тест?

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 голосов
/ 28 января 2019

Разбейте ваш код на тестируемые части.

Во-первых, генератор, который создает возможно бесконечный поток игровых состояний, но только по требованию:

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, или искусственные тестовые данные, которые вы создаете сами, чтобы убедиться, что цикл завершается (или не прекращается) по мере необходимости.

0 голосов
/ 27 января 2019

Вы не должны тестировать игровой цикл с юнит-тестами (слишком много зависимостей, чтобы подделать).Это не полезно здесь.Если у вас есть тест для self.move(active_player) и is_game_complete(), этого должно быть достаточно.Вы не можете получить 100% тестовое покрытие, особенно в разработке игр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...