Nauč se Python > Kurzy > Začátečnický kurz PyLadies > Moduly a testování > Zpětná vazba k domácím projektům

Feedback k domácím projektům

Úkol 1

Doplň funkci tah_pocitace tak, aby brala jako argument symbol, za který má počítač hrát – buď 'x',nebo 'o'. Ověř, že se funkce tah_pocitace umí vyrovnat s jinou délkou hracího pole než 20. Ověř si,že se tah_pocitace chová rozumně když dostane plné hrací pole, nebo pole s délkou 0. Rozumné chování v tomto případě znamená vyvolání rozumné výjimky.

Funkce tah_pocitace() před úpravou:

In [4]:
def tah_pocitace(herni_pole):
    """Vrátí herní pole se zaznamenaným tahem počítače."""
    while True:
        cislo_pozice = randrange(20)
        if herni_pole[cislo_pozice] == "-":
            return tah(herni_pole, cislo_pozice, "o")

Jedna z možností, jak funkci tah_pocitace() upravit:

In [5]:
def tah_pocitace(herni_pole, symbol):
    """Vrátí herní pole se zaznamenaným tahem počítače."""
    if len(herni_pole) == 0:
        raise ValueError("Nelze hrát, herní pole má délku 0")
    if "-" not in herni_pole:
        raise ValueError("Nelze hrát, herní pole je plné")
    while True:
        cislo_pozice = randrange(len(herni_pole))
        if herni_pole[cislo_pozice] == "-":
            return tah(herni_pole, cislo_pozice, symbol)

Ukázka testu, zda se umí tah_pocitace() vyrovnat s různou délkou herního pole.

In [ ]:
def test_tah_PC_ruzna_delka_pole():
    '''
    Test funkce tah_pocitace: program se umí vyrovnat s různou délkou hracího
    pole = nedojde k chybě, po tahu počítače se nezmění délka hracího pole
    a nové hrací pole bude obsahovat 1 znak symbolu "x" a zbytek bude prázdný.
    '''
    for delka_pole in range (1, 100):
        pole = '-' * delka_pole
        pole = ai.tah_pocitace(pole, 'x')
        assert len(pole) == delka_pole
        assert pole.count('x') == 1
        assert pole.count('-') == delka_pole - 1

def test_tah_PC_vyjimky():
    '''
    Testuje vyvolání vyjímky v případě herního pole nulové délky a herního pole
    bez prázdných míst.
    '''
    pole = ''  # prázné herní pole
    with pytest.raises(ValueError):
        pole = ai.tah_pocitace(pole, 'x')
    
    pole = 'xoxoxox'  # pole, kde není kam hrát
    with pytest.raises(ValueError):
        pole = ai.tah_pocitace(pole, 'x')

Ukázky dalších možných testů

In [ ]:
def test_tah_PC_zapln_pole():
    '''
    Test funkce tah_pocitace: při opakovaném tahu počítač zaplní celé pole
    '''
    pole = '----------'
    for i in range(10):
        pole = ai.tah_pocitace(pole,'o')
    assert pole == 'xxxxxxxxxx'

    
def test_tah_vyjimka():
    '''
    Test funkce tah: funkce vyvolá výjimku:
    --> ValueError - když dostane prázné pole nebo když jako symbol dostane
                    více znaků,
    --> IndexError - když má zapsat symbol na pozici mimo pole, když jako pozice
                    není INT,
    --> TypeError - když dostane jako symbol, který má zapsat INT místo STR
    '''
    with pytest.raises(ValueError):
        ai.tah('',0,'x')
        ai.tah('---',0,'abc')

    with pytest.raises(IndexError):
        ai.tah('---',10,'x')
        ai.tah('---------','A', 'x')
        ai.tah('---------',10.5, 'x')

    with pytest.raises(TypeError):
        ai.tah('---------',0,5)
        ai.tah('---------',0,10.5)


def test_tah_PC_ruzna_delka_pole():
    '''
    Test funkce tah_pocitace: program se umí vyrovnat s různou délkou hracího
    pole = nedojde k chybě, po tahu počítače se nezmění délka hracího pole
    a nové hrací pole bude obsahovat 1 znak symbolu "x" a zbytek bude prázdný.
    '''
    for delka_pole in range (1, 10000):
        pole = ai.tah_pocitace('-'*delka_pole,'o')
        assert len(pole) == delka_pole
        assert pole.count('x') == 1
        assert pole.count('-') == delka_pole - 1

Obecné rady a postřehy

  • Evergreen = ptejte se!
  • Dokumentační řetězce se píšou do třech uvozovek a patří na první řádky do těla funkce. Pokud si chcete poznamenat nějakou poznámku na jiném místě, používejte komentáře (#).

Toto je stránka lekce z kurzu, který probíhá nebo proběhl naživo s instruktorem.