Refactoring - umíte ho? A jak se ho učíte?

Kit

Re:Refactoring - umíte ho? A jak se ho učíte?
« Odpověď #45 kdy: 28. 12. 2017, 12:16:15 »
Do refaktorování uživatel vůbec nemá co mluvit, neboť funkcionalita se nemění.

To sice nemá, ale bez testů to do produkce nepustím... Opravdu si nelajznu, že tam bude nějaká chyba, jsme jen lidé.

Bez testů nemá význam ani refaktorování.


Franta <xkucf03/>

Re:Refactoring - umíte ho? A jak se ho učíte?
« Odpověď #46 kdy: 28. 12. 2017, 12:24:57 »
To se klidně může stát, ovšem problém není v OOP, ale v tom, že nemáš nikde přesně specifikované, jak se má který objekt/třída chovat – takže jednotkové testy střílíš od boku.

To casto ani nebyva specifikovane, pokial nenajimaju uplne lopaty ako programatorov. Inak musi byt ozrutny analyticky tim a bolo by lacnejsie, ak by to kodili analytici.

Tohle dělá spíš architekt/senior – detailní technická analýza, sepíše ten návrh na úrovni tříd a rozhraní, nakreslí pár obrázků a někdo to podle toho naprogramuje. Neříkám, že se to tak musí dělat vždy, spíš si myslím, že ne, nebo jen u kritičtějších věcí. Ale pokud se to dělá, tak máš jasné podklady a můžeš podle nich napsat dobře jednotkové testy. Pokud tuhle analýzu neděláš (písemně) a máš to jen v hlavě, resp. vymyslí si to ten samý člověk, který pak píše kód, tak si jednotkové testy sice taky může napsat, ale ty pak slouží vyloženě jen jako pomůcka programátora, aby si jimi odladil kód – užitečné to je, ale není tam žádná přímá vazba na požadavky a kvalitu z pohledu zákazníka/zadání.

Představ si, že bys měl proceduru s padesáti parametry, některé vstupní, některé výstupní, některé oboje a zdokumentované to budeš mít jen minimálně – přestože tam není žádné OOP, jednotkový test taky nenapíšeš – resp. nějaký napíšeš, ale bude k ničemu, protože nevíš, jak se to (na téhle úrovni) má chovat.
Ak ma procedura 50 parametrov, tak tam uz nieco strasne smrdi.

To byla narážka na ten tvůj popis OOP ;-)

Klidně si tam představ proceduru jen s pěti parametry – důsledky jsou stejné – pokud nemáš dobře zdokumentované rozhraní a návrh, tak nejsi schopný napsat dobré testy. Bez pořádné specifikace napíšeš testy, které akorát vytvářejí falešný pocit bezpečí – všechno bude krásně zelené, budeš mít vysoké pokrytí testy, ale neříká to nic o tom, zda program jako celek funguje správně.

gll

Re:Refactoring - umíte ho? A jak se ho učíte?
« Odpověď #47 kdy: 28. 12. 2017, 12:27:16 »
Dělení na jednotkové a funkcionální testy je umělé, používají ho hlavně manažeři. V praxi pro dobré pokrytí stačí testovat na vyšší úrovni.

Není pravda, že testy jsou práce navíc. Od určité velikosti programu nelze kontrolovat jeho správnost ručně. Psaní testů práci naopak urychlí.

Franta <xkucf03/>

Re:Refactoring - umíte ho? A jak se ho učíte?
« Odpověď #48 kdy: 28. 12. 2017, 12:38:01 »
Do refaktorování uživatel vůbec nemá co mluvit, neboť funkcionalita se nemění.
To sice nemá, ale bez testů to do produkce nepustím... Opravdu si nelajznu, že tam bude nějaká chyba, jsme jen lidé.

Pokud máš uvnitř nějaký algoritmus zabalený v nějaké třídě a tento algoritmus máš dobře zdokumentovaný a víš, pro jaké vstupy má vracet jaké výstupy, tak ten jednotkový test dává smysl a pomůže udržet kvalitu (kvalitu z pohledu zákazníka). Tedy za předpokladu, že máš napojení té třídy na zbytek systému správně a neuděláš chybu někde jinde, např. nepřehodíš znaménko nebo neposuneš řád nebo neprohodíš atributy někde výš.

Pokud ale ty třídy tak dobře zdokumentované nemáš a/nebo se obáváš, že uděláš chybu i někde jinde, tak potřebuješ integrační/systémové testy, které ověří funkci systému jako celku a budou k němu přistupovat co nejpodobnějším způsobem, jako to bude dělat uživatel v produkci. Tyhle testy ti dají mnohem větší jistotu, že to funguje správně, než ty jednotkové.

Ideálně použiješ kombinaci obou – pomocí komplexních testů ověříš základní scénáře a to, že jsou jednotlivé komponenty správně propojené. A pomocí jednotlivých ověříš všechny možné případy jednotlivých u jednotlivých tříd.

Výhodou jednotkových testů je to, že jsou rychlé, nemusíš překompilovat a nasadit celou aplikaci, můžeš si je pouštět pořád dokola a ladit algoritmus/třídu. Ale rozhodně nejsou samospásné – bez těch integračních/systémových testů se neobejdeš.

Franta <xkucf03/>

Re:Refactoring - umíte ho? A jak se ho učíte?
« Odpověď #49 kdy: 28. 12. 2017, 12:57:28 »
Dělení na jednotkové a funkcionální testy je umělé, používají ho hlavně manažeři.

Nemyslím si, že je to umělé dělení. Jednak testuješ na jiné úrovni a jednak (hlavně) ty testy mají jiný účel. Jednotkový test slouží hlavně programátorovi, aby mu usnadnil vývoj, ladění, aby umožnil lepší spolupráci mezi programátory (např. si můžeš odladit svoji třídu i když kolega odpovídající protikus ještě nemá hotový). Zatímco komplexní testy (integrační/systémové) ověřují shodu programu jako celku proti specifikaci schválené zadavatelem – a to je to, co zajímá zákazníka/uživatele (ne to, jaké parametry si předává Venca s Pepou mezi svými třídami kdesi uvnitř programu).

V praxi pro dobré pokrytí stačí testovat na vyšší úrovni.

Pokrytí je jen pomocný ukazatel – není to cíl – cílem je, aby program fungoval podle zadání (a aby zadání odpovídalo reálným potřebám).

Není pravda, že testy jsou práce navíc. Od určité velikosti programu nelze kontrolovat jeho správnost ručně. Psaní testů práci naopak urychlí.

+1