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í.