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ę
Otwórz praktykę →