Rozdział 19 · Architektura
Testowanie zasad gry
Ponieważ reguły są czystymi funkcjami, można je sprawdzać assert normalnie, bez okna i bez Xvfb.
Sprawdzamy zasady bezpośrednio, bez żadnego okna
Rozdział 19.26 pokazała, że zasady gry są czysto funkcjonalne. Można je więc sprawdzić
zwyczajny assertjak w rozdziale 3 — bez Xvfb, bez
turtle.Screen(), nie czekając na wyciągnięcie czegoś:
test_snake_logic.py
def test_move_snake_without_growth_drops_tail():
snake = [(0, 0), (-20, 0), (-40, 0)]
result = move_snake(snake, (20, 0), grow=False)
assert result == [(20, 0), (0, 0), (-20, 0)]
def test_wall_collision_boundary_is_safe():
assert is_wall_collision((280, 280)) is False
def test_wall_collision_beyond_boundary():
assert is_wall_collision((300, 0)) is True
Przypadki borderline to indywidualne testy, a nie jeden ogólny
„Bezpiecznie dokładnie na granicy” i „zderzenie nieco za granicą” — to dwa różne testy, nie jeden: jeśli połączyć je w jedno sprawdzenie, test może pozostać zielony nawet przy błędzie dokładnie w tym punkcie (rozdział 19.19 wyjaśniał, dlaczego granica jest uwzględniona).
Testowanie scenariuszy, dla których ważny jest przypadek (wybór jedzenia), pomaga
random.Random(seed) z ustalonym ziarnem – sekcja 19.18 już jest
wyjaśniłem dlaczego choose_food() akceptuje gotowy generator zamiast
Czyta Global random bezpośrednio:
test_food.py
def test_choose_food_never_lands_on_snake():
rng = random.Random(1)
snake = [(0, 0), (-20, 0), (-40, 0)]
for _ in range(50):
food = choose_food(snake, rng)
assert food not in snake
Praktyka: Pisanie testu zasad gry
Automatyczny test – funkcja test_boundary_is_safe(): test musi wykryć uszkodzoną wersję