Глава 17 · Тестирование
Тестируем игру без Tkinter
Чистая логика — прямая награда за архитектуру: тестируем правила игры без единого открытого окна.
Почему чистая логика легко тестируется
test_bez_okna.py
board = ["X", "X", "X", "", "", "", "", "", ""]
winner, line = find_winner(board)
assert winner == "X"
# Ни одного открытого окна Tkinter — просто список строк и обычная функция.
Прямая награда за архитектуру раздела 17.20
Это возможно именно потому, что
find_winner/is_draw ничего не знают про Tkinter. Если бы победитель определялся прямо внутри обработчика клика по кнопке — тестировать пришлось бы через настоящее окно и настоящие клики.Полная тестовая матрица игры
| Проверка | Ожидаемый результат |
|---|---|
| X выигрывает все 8 линий | find_winner возвращает ('X', линия) для каждой |
| O выигрывает все 8 линий | find_winner возвращает ('O', линия) для каждой |
| Пустое/неполное поле | find_winner возвращает (None, None) |
| Известная ничья | is_draw(board) is True |
| Последний ход одновременно выигрывает | find_winner побеждает, is_draw is False |
| Ход в занятую клетку | attempt_move ничего не меняет, current_player тот же |
| Ход после game_over | attempt_move ничего не меняет |
| new_round() | поле пустое, game_over=False, счёт СОХРАНЁН |
| new_match() | то же самое, но счёт ОБНУЛЁН |
Проверяйте все восемь линий, а не одну строку наугад
Тест только для одной строки не поймает опечатку в описании диагонали — Debug Lab 9 (раздел 17.29) устроен именно так, чтобы одна строка теста его бы не заметила.
Практика: полный набор тестов без Tkinter
Автоматическая проверка — вся регрессионная матрица игры: 8 линий × 2 игрока, ничья, последний ход, невалидный ход, сброс