PyLadies Brno

Testování

Instalace knihovny pytest

Následující příkaz nainstaluje do aktivního virtuálního prostředí knihovnu pytest, kterou bueme používat na testování.
(venv)$ pip install pytest

Co jsou testy?

Testy jsou funkce, které zkontrolují, že náš program funguje správně. Výhoda psaní testů je ta, že je můžeme kdykoli spustit a ověřit si, že jsme v programu nic nerozbily.
Píšou se takhle (kód dej do souboru test_secteni.py:
def secti(a, b):
    return a + b

def test_secti():
    assert secti(1, 2) == 3
Testy se spouští zadáním příkazu py.test -v:
$ py.test -v
============= test session starts =============
platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.5.2 -- /.../bin/python3.4
collected 1 items 

test_secteni.py:4: test_secti PASSED

========== 1 passed in 0.01 seconds ===========
Tento příkaz projde všechny soubory v aktuálním adresáři, jejichž jméno začíná na test_, a zavolá v nich všechny funkce, jejichž jméno začíná na test_, a ověří, že nevyvolají žádnou výjimku. Pokud výjimka nastane, dá nám to velice červeně najevo, a přidá několik informací, které nám můžou usnadnit opravu chyby.

Testovací moduly

Vytvoř si modul test_piskvorky (tedy soubor test_piskvorky.py), a do něj napiš:
import piskvorky

def test_tah():
    pole = piskvorky.tah_pocitace('--------------------')
    assert len(pole) == 20
    assert pole.count('x') == 1
    assert pole.count('-') == 19
Pak vedle něj (t.j. do stejného adresáře) zkopíruj svůj program piskvorky.py, ze kterého vyndej kód, který není ve funkcích (t.j. samotné volání funkce piskvorky1d). Spuštěním py.test teď můžeme otestovat funkci tah_pocitace!

Spouštěcí moduly

Teď vytvoř modul hra.py, který bude obsahovat jen volání funkce piskvorky1d:
import piskvorky

piskvorky.piskvorky1d()
Tenhle modul nebudeme testovat, protože nepřímo pustí funkci input(), která potřebuje vstup od uživatele. Budeme ho jen spouštět, když si budeme chtít zahrát.

Pozitivní a negativní testy

Můžeme testovat i reakci programu na neočekávaný vstup, například funkce tah_pocitace by měla způsobit chybu (třeba ValueError), když je herní pole už plné.
Na to použijeme příkaz with a funkci raises naimportovanou z modulu pytest. Jak tento příkaz přesně funguje se dozvíme později, teď stačí říct, že tehnle příkaz ověří že odsazený blok kódu pod ním vyvolá danou výjimku:
import pytest

import piskvorky

def test_tah_chyba():
    with pytest.raises(ValueError):
        piskvorky.tah_pocitace('oxoxoxoxoxoxoxoxoxox')
Testy, které kontrolují reakci na špatný vstup, se jmenují negativní testy. Většinou kontrolují že nastane (správná) chyba, Když náš kód pak použijeme ve větším programu, můžeme si být jisty, že při špatném volání dostaneme chyby – a srozumitelné chyby se dobře opravují.