Při testování metodou bílé skřínky (white box) je obecná snaha o co největší pokrytí testovaného kódu (code coverage). Minimálně byste se měli snažit o to, abyste testy pokryli každý řádek vašeho programu, který stojí za to testovat (např. obě větve každého úplného if-else příkazu, ale už ne třeba situace typu assert false, 'x > 0; this should never happen'
). O tom, jak si zjistit aktuální pokrytí vašeho kódu v jazyce Python bude následující příspěvek.
Osobně na zjišťování pokrytí kódu v Pythonu používám figleaf. Zkoušel jsem i jiné nástroje, ale žádný z nich nesplňoval následující předpoklady, které od podobného softwaru očekávám (figleaf je splňuje):
- Jednoduché použití.
- Možnost zákazu zjišťování pokrytí kódu standardních knihoven (nepodstatné).
- Přehledný grafický výstup ve formátu HTML.
Po stáhnutí a rozbalení/instalaci figleafu zjistíte pokrytí vašeho kódu testy následovně (run-tests.py
nahraďte vašim scriptem, který testuje zdrojový kód):
figleaf -i run-tests.py
Volba -i
vypíná zjišťování pokrytí pythonovských knihoven. Vypadne vám nezajímavý souboru .figleaf
, ze kterého vygenerujete smysluplný výstup v HTML následovně:
figleaf2html -d html_output_addr .figleaf
html_output_addr
je cesta k adresáři, do kterého se vygenerují HTML soubory. Report si pak můžete prohlédnout v prohlížeči. Na hlavní stránce je seznam testovaných modulů s údajem o pokrytí. Tím se ale nezabývejte, protože opravdu není cílem se dostat na 100% pokrytí kódu - jsou věci, které se nevyplatí automatizovaně testovat (např. funkce, která pouze tiskne nápovědu k programu či kód typu except AttributeError: sys.stderr.write('Need python 2.5 to run this program.\n'
).
Důležité jsou stránky obsahující zdrojový kód jednotlivých modulů, kde jsou červenou barvou znázorněny ty části, které při běhu testů nebyly interpretované.
Nad každou z těchto částí se zamyslete. Je to v pořádku, že daná část nebyla vykonán? Nechybí mi test na tady tu část? Touto analýzou poměrně snadno zjistíte, jak je na tom vaše pokrytí kódu testy. Samozřejmě, nelze to brát jako jediné měřítko otestovanosti vašeho programu, ale svůj účel to plní dostatečně.