Jak psát testovatelný kód v Pythonu?

obrázekTroufl bych si říci, že na WebExpo 2011 byly testy jedním z předních vývojářských témat. Ať už šlo o JavaScript, PHP nebo cokoliv jiného, hojně se testování skloňovalo.

Já osobně jsem v testování úplný začátečník. Testy jsem nepsal a nepíšu, ale rád bych se to naučil. Bohužel, na vysokých školách jsem neměl to štěstí být donucen jediný test napsat, pokud tedy nešlo o test mých chabých znalostí ;-)

Už dříve jsem pochytil nějaké základy o testovatelnosti kódu a následně i dependency injection (hezky vysvětlil Fabien P.) v PHP, která s ním úzce souvisí. Na WebExpu jsem si tyto teoretické znalosti rozšířil díky workshopu. Myslím, že teď už základní principy chápu a schází mi především praxe. Bohužel, jediný PHP projekt, který teď udržuji, je ConcertIn a ten je na starším Nette a navíc strašně závislý na Facebook platformě, takže abych něco testoval, musel bych upgradovat framework a polovinu věcí si namockovat. Což se mi pro začátek moc nechce, akorát by mě to otrávilo.

Většinu věcí píšu teď v Pythonu. Bohužel mi tamtéž unikla přednáška Honzy Krále o testování v Pythonu. Projíždím čas od času uveřejněné videozáznamy přednášek, ale pořád ji tam nevidím.

Se zavedením testů do Pythonu mám ale problém. Ono je totiž PHP (Java, C#…) jiné než Python a já si prostě ta naučená teoretická pravidla neumím nějak v Pythoním kódu představit. Něco už jsem v tom jazyce napsal a myslím, že je běžnou praxí psát v modulech obyčejné funkce, importovat si je do jiných modulů, importovat si tam a zpět nějaké proměnné, třídy, třídy chovající se jako funkce… Vidím takové věci jak v Djangu, tak ve Flasku. Python je tak dynamický, že mi dělá problém aplikovat na něj tatáž pravidla jako pro PHP, kde stačí říct „nesmíte ve třídě udělat new, nové objekty prostě musí přijít zvenčí připravené“.

Ano, mohl bych jej podrobit přísnému režimu a psát kód, který by byl přísně objektový a všemu vyhovoval, ale to by potom vůbec nebylo pythonic, nevyužíval bych toho jazyka plně tak jak byl navržen a tak jak to dělají všichni ostatní. No a to je druhá věc – externí knihovny neovlivním a jsou psány stejným způsobem (tzn. i ve svém API očekávají, že budou použity v podobném pythonic kódu). Jednoduše, šel bych proti přirozenosti Pythonu. Myslím si, že pes bude zakopaný někde jinde.

Ale kde? No, a to právě vůbec nevím. Hledal jsem po internetu chvíli nějaké best practices psaní testovatelného kódu v Pythonu, ale moc jsem toho nenašel. A proto bych vás chtěl poprosit: Pomůžete mi vyřešit tento můj problém? Nemáte odkazy na nějaké dobré zdroje, které bych pročetl a bylo by mi tohle všechno hned jasné? Potřebuji příklady, nějaké ukázky z praxe, kde bych to opravdu pochopil, abych mohl takový kód psát, následně tvořit testy a potom to dělat tak dlouho, než do toho proniknu do hloubky a budu moci poučovat zase druhé ;-) Díky za každý komentář!