48 komentářů k článku Testování v PHP: praktický příklad:

  1. michal

    Testování

    Díky za článek, ale pořád je pro mne tento příklad na úrovni „příkladu s kalkulačkou“, tedy lehce otestovatelné, predikovatelné. V reálných aplikacích vidím daleko složitější a více problémové části kódu k otestování.

    1. arron

      Re: Testování

      V tomto článku možná chybí nějaká externí závislost, což je při rozsahu příkladu trochu škoda. To by Vám ukázalo, jak se s takovou věcí v testech vypořádat.

      Jinak v reálných aplikacích by správně měly být testy úplně stejně jednoduché, protože každá metoda, kterou testujeme, dělá jednu jedinou jednoduchou věc :-) V praxi je to zpravidla o dost složitější, ale při hlubším zamyšlení vždy docházím k tomu, že na vině je špatně navržený a napsaný kód.

      A ano, kód, který nerespektuje základní požadavky, jako třeba Single Responsibility Principle, DI pattern a podobné, tak takový kód se opravdu pekelně blbě testuje!

      1. Martin Hassman

        Re: Testování

        Však napřed to jednoduché, až pak teprve složité. Seriál se stále rozjíždí, není ani v polovině, není nutné nacpat hned vše do jednoho dílu.

        1. michal

          Re: Testování

          Jsem zvědav jak to celé dopadne. Zásadní na testování vidím pouze toto: „Jak napsat/navrhnout otestovatelnou aplikaci“. Vše ostatní mi připadá oproti tomu „jednoduché“

      2. Josef ZamrzlaAutor příspěvku

        Re: Testování

        Počkejte si na díl o mockování, tam najdete přesně co hledáte. Zatím se bavíme pouze o základních unit testech.

          1. Josef ZamrzlaAutor příspěvku

            Re: Testování

            V záhlaví článku uvádím, že se budu INSPIROVAT příkladem s BankAccount. O nějakém opisování nemůže být řeč.

          2. Martin Hassman

            Re: Testování

            To je podobné, jako kdybyste obvinil autory všech knížek, co použili „Hello world“, že je opsali. Neopsali, některé věci se prostě opakují znovu a znovu, ať Hello world nebo příklad s bankovním účtem.

  2. lenochware

    Re: Testování v PHP: praktický příklad

    Mě se zdá, že skutečná výhoda unittestů se projeví až ve chvíli, když pracuji v aplikaci ve větším týmu programátorů nebo vyvíjím nějaké reusabilní komponenty používané více lidmi. Tam je to pak opodstatněné, protože když někdo jiný udělá úpravu, tak může spustit testy a ověřit jestli něco nerozbil.

    Výhoda, že spustím testy a vidím jestli se něco nerozbilo platí sice i u jednoho programátora, který píše dejme tomu jednoduchý shop, ale za všechno se musí platit a tady platím imho o dost delší dobou vývoje danou psaním testů. Navíc mám za to, že unittesty nenahrazují betatesting – imho můžu víceméně otestovat jen chyby o kterých vím, že můžou nastat. Takže u menšího projektu bych asi zvažoval jestli se to vyplatí…

    1. Čelo

      Re: Testování v PHP: praktický příklad

      Já myslím, že se to nevyplatí jen v případě, že je vaším záměrem to rychle nabastlit s tím, že doufáte, že už to nikdy v životě neuvidíte ;)

    2. arron

      Re: Testování v PHP: praktický příklad

      „…platím imho o dost delší dobou vývoje danou psaním testů…“

      A to je právě ten nejzásadnější nesmyslný předsudek :-) Samozřemě, že chvíli trvá, než se člověk naučí unit testy psát. Úplně stejně, jako nějakou chvíli trvá se naučit nějaké API. Nicméně ve finále člověk, který nemá unit testy stráví tolik času laděním, hledáním chyb, opravováním chyb při změně kódu apod. tolik času, že psaní unit testůz toho vychází o dost výhodněji :-)

      1. Budela

        Re: Testování v PHP: praktický příklad

        A to je právě předsudek. Tohle tvrzení jsem slyšel snad tolikrát, ale pořád se to předkládá jen jako nějaký axiom. Jako něco co není potřeba dokazovat. A já tomu stejně nevěřím. Chtěl bych aby někdo dokázal, že když budu psát testy, tak nad nimi strávím x hodin, ale když je nenapíšu, tak strávím Y hodin laděním a hledáním kdovíčeho. Já tomu prostě nevěřím.

        1. Josef ZamrzlaAutor příspěvku

          Re: Testování v PHP: praktický příklad

          Zkuste prosím místo předsudků používat úsudky. Dokud testování nebo tdd nevyzkoušíte v praxi, nemůžete jeho přínos relevantně zhodnotit.

        2. arron

          Re: Testování v PHP: praktický příklad

          Není to axiom, je to kalkul. Analogie s dřevorubcem není uplně přesná, ale myslím, že jí tady pro demostraci mohu použít :-)

          Dřevorubec kácí v lese stromy a musí jich každý den pokácet nějaký počet. Postupně se mu ztupí sekera a on je stále pomalejší a pomalejší má velký problém tu svojí kvótu splnit. Když se ho pak někdo zeptá, proč si sekeru nenabrousí, tak dřevorubec odpoví, že nemá čas, protože jinak to nestihne.

          Psaní testů je takové broušení sekery.

          Pokud se vrátím k tomu kalkulu. Co je rychlejší? Dělat pořád dokola činnost, která mi zabere hodinu (ruční testování sw, hledání chyb apod.) nebo strávit deset hodin automatizací této činnosti a pak jí vykonávat v řádu vteřin po dobu zbytku vývoje projektu?

          Protože se ve vývoji webových aplikací už nějkou dobu pohybuji, tak na tyto počty opravdu nepotřebuji vědeckou studii ;-)

          1. Budela

            Re: Testování v PHP: praktický příklad

            Tak já nevím, mně přijde, že když budu psát kvalitní objektový návrh, testovatelný kód (bez testů) tak si tu sekeru nabrousím lépe.

            Navíc si nemyslím, že rozdíl mezi psaním testů a nepsaním testů je v řádu vteřin. Párkrát jsem to zkoušel a třeba takové TDD je podle mého opruz a ztráta času dost velká. Pokud se několikrát během psaní aplikace rozhodnu změnit rozhraní třídy, tak to znamená pořád dokola měnit spoustu testů. Navíc každá změna specifikace znamená rozbití testů a jejich následná oprava. Rozhodně to není v řádech vteřin.

            Netvrdím, že testování je špatné a že bez něho je vývoj lepší. Chci pouze říct, že tvrzení o tom, že psaním testů člověk ušetří čas, se mi zdá jako přehnané. Tvrdí to všichni, tvrdí to často a podle mého se mýlí. Podle mého je psaní testů časově náročnější, ale jsou z toho jiné benefity.

            1. arron

              Re: Testování v PHP: praktický příklad

              Já také netvrdím, že psaním testů člověk ušetří čas přímo při psaní kódu. Já tvrdím, že ušetřím čas při testování, ladění a hledání chyb. Zmiňovaný časový rozdíl je zde mezi ručním testováním (čili F5 hell) a tím, že pustím sadu testů, které totéž udělají v řádově kratším čase :-) Testy mohu pouštět třeba 100x denně, zatím co ruční testování celé aplikace po každém commitu…ani to nechci domýšlet :-) Vidítě „jistý“ časový rozdíl?? A kvalitativní? Jaká je pravděpodobnost, že rychle odhalím chybu, když testují 100x denně a jaká, když „to večer projedu ručně“?

              Každá změna specifikace hlavně znamená rozbití aplikace ;-) Testy mi pomohou zjistit, kde všude se aplikace rozbila a pomohou mi jí opravit. Následně mi řeknou, jestli je oprava kompletní a funkční.

              TDD imho dost selhává ve chvíli, kdy nevím co píšu,čili nevím, co mám testovat (ačkoliv jedna z přednášek na Webexpu mě nutí tento názor začít přehodnocovat). Osobně si však myslím, že v tomto směru selkávám spíše já než TDD. Je to prostě opravdu změna mindsetu.

              1. anonym

                Re: Testování v PHP: praktický příklad

                Argument proti nezpochybňoval výhodu automatického testování. Zdůrazňoval nevýhodu přepisování již hotových testů v momentě, kdy se mění rozhraní.

                Tento článek zatím jen ukázal, jak se testuje. Fajn, ale příklad je příliš vyumělkovaný, podobného kódu mám v běžné webové aplikaci tak 2-10 metod, u kterých potenciál testování nezpochybňuji. Ale TDD by mě měl tlačit testovat vše a to si neumím prakticky představit. Doufám,že tento seriál neumře dříve, než v něm bude napsána kompletní reálná funkční aplikace (i kdyby blbý blog nebo pidieshop) a na ní předvedeno TDD v praxi.

        3. Clary

          Re: Testování v PHP: praktický příklad

          Nejde pouze o testování samotné. Nedávno jsem si dělal malou aplikaci a vykašlal jsem se na testy s tím, že je doplním později. Když jsem později začal testy doplňovat, zjistil jsem, že jsem nevědomky na mnoha dílčích místech napsal netestovatelný=špat­ný kód, i když jsem si celou dobu namlouval jak je aplikace krásně objektově strukturovaná. Teď musím provádět refaktoring, místo abych přidával další featury.

        4. j

          Re: Testování v PHP: praktický příklad

          Je to celkem jednoduche – pokud mate testy, neco zmenite, tak zcela trivialne zjistite, zda to nerozbilo neco, co predtim fungovalo (ohromna uspora casu).

          V opacnem pripade muze autor leda tak doufat a modlit se, protoze asi nepripada moc v uvahu nejake rozsahlejsi testovani cele aplikace kvuli „drobne“ uprave.

          Ano, jsou dodavatele, kteri to resi tak, ze provedou upravu, a cekaji, az se ozvou uzivatele … (vytvory jednoho takoveho mam tu „cest“ adminovat …). Pokud nevadi nasrani uzivatele a potencial zalob o nahradu skod, je to celkem jedno.

          V kazdem pripade oni stravi odladovanim i nekolik tydnu, protoze vzdycky „nekde neco opravi“, ale malo kdy vsechno co rozbili, pripadne tou „opravou“ rozbijou neco jineho.

    3. Michal

      Re: Testování v PHP: praktický příklad

      Programovat bez testu je jako hrat hru bez savovani. O vsem co otestujes muzes rict, ze to mas pod kontrolou (jako ulozenou pozici). Aplikaci ti muze rozbit prakticky cokoli vcetne upgradu php.
      Az praxe te nauci kolik trnu s tim muzes ze svych pat vytahnout nez se na ne postavis… (nez upravy nasadis)

  3. RDPanek

    Testování znamená zajišťování určité míry kvality

    Přátelé, už jen v podstatě samotného testování se skrývá důvod, proč testovat. Ať již využijete z mnoha nabízených postupů a typů testů, tak zajistíte výsledné aplikaci jistou úroveň kvality a povíte o sobě, že odevzdáváte něco co je pokryté do určité míry testy. Klientovi při předávání aplikace spustíte jednotlivé sady podle předem napsaných testplánů, klientovi v rámci přejímání řeknete, že zadaná část se zdá opravdu být v pořádku. Takže pro klioše +1. Důvod sami pro sebe, proč testovat je ten, že vaši kolegové vkročí na zpevněnou půdu a vy máte jistou úroveň jistoty, že se vám přes rozhranní nedostane nic mimo hraniční hodnoty s čím nepočítáte. Bez testování se neobejdete v CI (platí to tak všude, že?). Takže pro vás +1. Důvod pro vašeho zaměstnavatele je ten, že pokud při vývoji narazíte na jednu z několika typů chyb, tak je její oprava rychlejší/levnější, než když chybu objeví kdokoli jiný směrem k zákazníkovi.

    Nic méně, ze skušenosti mohu říct, pokud vám testy nedávají smysl, tak ani netestujte – dají se napsat testy, které zdánlivě vypadají v pořádku, vykazují určité procento pokrytí, ale ve skutečnosti jsou napsány špatně.

    Ideálně, kdyby unit testy psal sám programátor a ostatní typy testů jiný programátor / tester / QA.

    Obecně platí, že se nevyplatí vyvíjet aplikaci bez toho, aniž by se počítalo s pokrytí testy.

    1. none_

      Re: Testování znamená zajišťování určité míry kvality

      Základní problém je, že někdo musí managerovi a zákazníkovi vysvětlit, že díky tomu, že strávíme stejně času psaním unit testů jako programováním, on ve výsledku ušetří.

      To se bohužel dost těžko vysvětluje, pokud to první nabídku zdraží o X Kč…

      1. arron

        Re: Testování znamená zajišťování určité míry kvality

        Ufff…

        Vždyť tohle přece není pravda.

        Projekt má rozpočet 100%. Obvykle je to tak, že se z toho rozpočtu řekněme (příklad) 50% programuje, 20% testuje a 30% se opravují chyby.
        Pokud budu testovat, tak budu 70% programovat, testovat budu průběžně pomocí CI a automaticky, takže ten čas tam započítávat nemusím, 10% času budu opravovat bugy, které jsem nepokryl testy (a pokryju je testy) a zbývá mi 20% rozpočtu na to abych se třeba věnoval klientovi. Kde je jaké navýšení??
        Ty poměry jsou pro příklad, protože jsou hodně individuální…

        Problém spíše vidím v tom, že se netestuje vůbec a v rozpočtech se s tím obvykle vůbec nepočítá (a nebo jsou odhady VELMI optimistické). Zpravidla to pak testuje klient za provozu. Je to jeden z hlavních důvodů, proč se téměř každý projekt protáhne a prodraží a ještě k tomu moc nefunguje…

        1. RDPanek

          Re: Testování znamená zajišťování určité míry kvality

          ano, to jsou zpravne argumentace. Nic mene toto tema je tak casto promilano stejne tak jako jestli je lepsi windows nebo linux a stejne si jede kazdy po svym podle sveho presvedceni.

          Toto tema neni vhodne pro diskuzi tohoto clanku, pokud nemoku nedava smysl testovat, doporucuji navstivit skoleni, kde se ucastnici dozvedi, druhy chyb, jejich vznik a jejich dopad.

  4. Honza

    Testování odhaluje chyby

    Vidím že se rohořela diskuze stejně plamenná jako u předchozího článku, tak přihodím jedno kontroverzní polínko, aby to ještě pokračovalo:

    Programátoři jsou různí. Někdo je chytřejší někdo hloupější, někomu to lépe myslí v jednom směru, jinému v jiném. Někdo dokáže vymyslet abstraktní konstrukce, někdo dokáže rovnou přemýšlet v SQL, někdo je zase extrémně pečlivý a puntičkářský.
    Pokud o sobě vím, že patřím k lidem, kteří dokážou jít za celkovým cílem a v rychlosti vychrlit kód pro několik rutin za sebou, tak musím mít napsané automatické testy, protože se bez nich neobejdu. Pokud o sobě vím, už při psaní kódu dokážu pečlivě promýšlet všechny cesty, kterými může běh projít a celou rutinu při psaní mentálně obsáhnu, tak automatizované testy potřebuju podstatně méně.

    Všimněte si, že se záměrně vyhýbám tomu, označovat někoho za lepšího a někoho za horšího programátora. Prostě jen někdo testy nepotřebuje, protože testy stejně otestuje jen to, co ho otestovat napadne a to ví už při psaní, že je správně.

    1. arron

      Re: Testování odhaluje chyby

      Podle „druhu programátora“ bych spíše zvolil úpravu metodiky. Já osobně napřiklad někdy chytnu slinu, nějak to zbastlím a pak strávím nějaký čas psaním testů a refaktoringem. Jindy zase opravdu napíšu nejdřív testy a pak teprve implementuji…jak to zrovna přijde.

      Tak jak jste to napsal to skoro vypadá, že někteří programátoři nedělají chyby :-) Můžu Vás ujistit, že to není pravda ;-)

      1. Honza

        Re: Testování odhaluje chyby

        Nevěřím, že existuje programátor, který nedělá chyby. Ale je jasné, že různí programátoři dělají různé chyby. A různé chyby se různě hledají. Domnívám se, že někteří programátoři můžou mít díky charakteru chyb, které dělají, větší užitek z automatizovaného testování než jiní.
        V překladu – jsou i programátoři, kteří nedělají tolik chyb, které jsou odhalitelné automatickými testy, aby se jim vyplatilo automatické testy psát.

        1. j

          Re: Testování odhaluje chyby

          Pokud ty testy pojmete truchu do sirky, muzete vygenerovat i zatezovy test aplikace, a tady se uz neda mluvit o chybach programatora, protoze ta aplikace „nejak“ funguje, ale casto zni otazka „jak“.

          Dost si nedovedu predstavit, jak neco takoveho dela nekdo „rucne“, pripadne jak analizuje kod a zjistuje, kde jsou vykonostni problemy.

    2. Jiří Knesl

      Re: Testování odhaluje chyby

      Ale všichni pracujeme v prostředí, kdy nás někdo vyrušuje. Kdy musíme přepínat kontexty. Kdy nejsou jen pondělky, úterky a středy, ale kdy programujeme i v pátek odpoledne a nemyslí nám to tolik, jako v pondělí. Jsou dny, kdy se doma něco stane a v práci se nemůžeme soustředit. Používáme nové technologie a postupy, frameworky, které neznáme.

      A tohle je realita nás všech, výsledkem čehož je, že se dostáváme do situací, kdy každý udělá nějaké chyby, ikdyby byl sebevíc svědomitý. A testy jsou zatím lidstvu nejznámější prostředek detekce chyb.

      1. Honza

        Re: Testování odhaluje chyby

        Klasický červený sleď.
        Nevím, jestli jste si toho všiml, ale nikde jsem nepsal, že je někdo, kdo nedělá chyby. Tzn. vybral jste si k rozporování něco, co jsem vůbec nenapsal a ani si to nemyslím.

        Čili ještě jednou, jen zjednodušeně – různí programátoři dělají různé chyby, různé chyby se různě hledají. Automatizované testy jsou jedním ze způsobů hledání chyb a pro některé programátory tudíž prostě nemusí být efektivní je používat, protože neodhalí chyby, které dělají, ale jen ty, které nedělají.

        1. Jiří Knesl

          Re: Testování odhaluje chyby

          Reaguju: „Pokud o sobě vím, už při psaní kódu dokážu pečlivě promýšlet všechny cesty, kterými může běh projít a celou rutinu při psaní mentálně obsáhnu, tak automatizované testy potřebuju podstatně méně.“

          Při běžném provozu (neustálé vyrušování, méně energie v pátek odpoledne, menší soustředění apod.) tvrdím, že prostě není možné chyby nedělat a proto není možné se bez nějakého prostředku obejít (a testy považuju za nejznámější, byť ne jediný prostředek). Věřím, že myšlenka, že dokážete promyslet všechny cesty, kterými může běh projít, je u netriviálních aplikací nereálná.

          1. Honza

            Re: Testování odhaluje chyby

            Asi nemá smysl se dohadovat dál. Odmítáte přistoupit na to, že je možné dělat různé druhy chyb. Nikde jsem neříkal, že by měl být kdokoliv imunni vůči jakýmkoliv chybám. Pouze si myslím, že chyby jsou různé – od špatného návrhu (který vám automatizované testy rozhodně neodhalí) až k překlepům (které odhalí už syntaktická analýza) – a že ne pro všechny druhy chyb se automatizované testování hodí.

            1. Josef ZamrzlaAutor příspěvku

              Re: Testování odhaluje chyby

              Honzo, opakuji svou odpověď z diskuse pod minulým dílem – pletete dohromady naprosto neslučitelné pojmy. Tento seriál se zabývá dynamickým testováním, nikoli statickým testováním návrhu. Sytaktickou analýzou se testování nezabývá už vůbec, to je součástí kompilace.

              1. Honza

                Re: Testování odhaluje chyby

                To je myslím nedorozumění – rozdíl si dobře uvědomuji. Testování návrhu a chyby syntaxe jsem myslel právě jako příklady, kdy nemá o automatizovaných testem smysl hovořit.

                1. Josef ZamrzlaAutor příspěvku

                  Re: Testování odhaluje chyby

                  To je ale jako byste říkal, že nemá smysl jezdit autem, protože auta neumí létat. Používáte jako argumenty fakta, která vůbec nesouvisí s tématem.

                  1. Honza

                    Re: Testování odhaluje chyby

                    Nevím, jestli jste četl celé vlákno, ale já jsem obhajoval myšlenku, že jsou různé druhy chyb a na některé z nich je možné automatizované testy používat a na některé z nich ne. Což je přesně to, co píšete o příspěvek dřív, takže vcelku nevidím rozpor.

                    1. mino

                      Re: Testování odhaluje chyby

                      Tvrdite, ze existuju chyby, ktorych sa urciti ludia nedopustaju. Oponenti sa Vam snazia povedat, ze toto tvrdenie je naivne a nebezpecne. Pripustme povedzme, ze niektori ludia spravia priemerne menej chyb, (ktore mozu rozbit aplikaciu na uplne opacnom konci.., resp. doplnte si typ chyby, ktory mate na mysli) ako ini ludia. Stale vsak je naivne tvrdit, ze tito ludia nespravia ziadnu takuto chybu. Aj ked je takato chyba v release jedna, a zisti sa povedzme po tyzdni ostrej prevadzky, je to zbytocne, ked sa jej dalo predist jednym spustenim testu na dev prostredi a jednym na produkcii po release. Ked k tomu pridam este hodnotu financej straty klienta, ktoru tymto sposobom samozrejme nemozme charakterizovat (i. e. niektori programatori proste robia chyby, ktore su lacne, niektori, ktore su drahe, ti, ktori robia iba lacne chyby, unit testy nepotrebuju – dufam, ze s tymto polemizovat nebudete) tak by ste snad mohol zacat vidiet prinos testov.

                      Skor by som sa priklonil k myslienke, ze niektore aplikacie nepotrebuju testovanie, resp. ho potrebuju menej ako ine aplikacie. Napada ma napr. ‚Hello world‘ : )

                      Aby som sa nevyjadroval absolutne, tak kazda aplikacia, ktora sa sklada z viac ako jednej „jednotky“ (unit) moze z pritomnosti unit testu iba ziskat.

            2. Jiří Knesl

              Re: Testování odhaluje chyby

              Asi fakt mluvíme o voze a o koze.

              Já vůbec neodmítám, že jsou různé druhy chyb. Jsou chyby, na které testy nepřijdou.

              Já odmítám myšlenku, že při jakémkoliv psaní kódu je možné psát tak, aby současně s jinými chybami nevznikaly i chyby, které testy odhalí.

              1. Honza

                Re: Testování odhaluje chyby

                V tom případě se zřejmě shodujeme, protože nemám pocit, že bych někde tvrdil, že je možné psát kód tak, aby určitý druh chyb vůbec nevznikal – pouze to, že někdo má větši tendenci k jednomu druhu chyb a někdo k jinému.
                Pokud o sobě vím, že dělám opravdu málo chyb, které mohou odhalit automatizované testy, ale za to často úplně zvořu návrh, je pak pro mne užitečné věnovat více času přemýšlení nad návrhem a méně času (0?) věnovat psaní automatizovaných testů.
                Je to takhle pro vás ještě akceptovatelné?

  5. https://vladimirpilny.mojeid.cz/#2oFvdzWbch

    Líbí se mi TDD, ale připadá mi to jen jako teorie

    Líbí se mi myšlenka TDD, že by se dalo testovat automaticky a rychle odhalit narušení již funkčního kódu. Problém je, že všechny „školní ukázky“ jako je tento, jsou v podstatě kvůli nenáročnosti zbytečné (testování sčítání 2 čísel).
    Projekty v PHP, se kterými pracuji, mají mnoho různých úrovní a je potřeba testovat velké množství různých situací na straně serveru i klienta a na to už žádné názorné ukázky nikde nevidím (a tak se obávám, že to ani nepůjde). Jde mi o komplexní chování – práce s databázemi, sešny a cookie, kompatibilitu HTML zobrazení a chování, běh javascriptu, funkčnost DOM, AJAXová volání, paralelní přístupy a zamykání, simulace síťových výpadků, atp. Přitom na pozadí běží různí démoni a údržboví čističi, takže i DB se průběžně mění…
    Navíc ve chvíli, kdy vstupem není číslo či řetězec, ale např. ZIP archív posílaný po síti, který mám rozbalit, a něco s obsahem udělat, tak je asi milion věcí, co se může pokazit vzhledem k problematickému vstupu.
    Pokud někdo víte, jak tohle všechno automaticky testovat, tak sem s tím. Jinak mi vychází, že nejlepší je, když vývoj vede velmi zkušený vývojář, který zná dobře všechna zákoutí všech použitých technologií a hlavně u toho přemýšlí hlavou (a ne jen poučkami z učebnic softwarového inženýrství). :)

    1. Michal

      Re: Líbí se mi TDD, ale připadá mi to jen jako teorie

      Jsi na ne moc hrrr. Vydrz casu, serial ti postupne odpovi.

      1) unit testing: V tomhle dile jde o testovani tridy ktera nema externi zavislosti. To znamena, ze testujes prime hodnoty in/out – to je prece super priklad na zacatek no ne?
      Za par dilu pokroci serial 100% k testovani zavislosti na zaklade „fejkovani“ instanci cizich trid, ktere testovana trida vyuziva. Proto abys takove tridy mohl testovat, musis dodrzovat urcita pravidla. Napriklad nikde v tride nesmis mit zavislosti hardcodovane. Pikud jsi nekde kolem zachytil pojem „Dependency injection“ tak ten se tyka prave tohoto. Pomoci DI udrzujes tridu vysoce testovatelnou, protoze ti to v ramci unit testu umoznuje nahradit tyto zavislosti takzvanymi „mocky“ – fejkovymi instancemi, ktere dovedou naslouchat tomu co s nimi tva testovana trida dela a na zaklade toho ty se potom muzes v tech testech muzes ptat jestli se testovana trida opravdu snazila „ziskat uzivatelovo jmeno z databaze“ a taky treba kolikrat se o to snazila.
      V ramci unit testu ti toto musi stacit protoze testujes konkretni ocekavane chovani jedne tridy – jednotky kodu.
      Nemusim asi zduraznovat, ze toto tve ocekavani chovani tridy, ktere ty temi testy pokryjes se muze zborit jakymkoli vlivem vcetne upgradu PHP na novejsi verzi. To je obrovskej prinos unit testu!

      2) integracni testing – dalsi stupen testovani, ktereho se tyka tva poznamka – v tzv. integracnich testech jde o to, jak tve jednotky komunikuji mezi sebou a dale treba i s databazi. Tim se tedy zacinas priblizovat konkretnim situacim, ktere ti muzou nastat v realnych podminkach v aplikaci.
      V integracnim testu si napriklad nastavis konkretni prostredi (napriklad nahazis do kosiku eshopu nejake produkty) a testujes jestli ti jakasi trida kosiku (napriklad) vraci spravne cenu celkem, cenu s dani apod…
      Videl jsem hodne aplikaci, ktere mely pouze integracni testy a zadne unit testy ani neobsahovaly. To ale neni idealni, protoze unit testy jsou nejblize potencialni pricine problemu a vetsinou ti umozni hcybu odhalit doslova primo v miste kde vznikla.

      3) testy chovani – dalsi stupen testovani aplikace kde uz testujes realne http komunikaci, obsah DOM documentu a konkretnich css selectoru, http hlavicky apod. – temi uz jsi schopen overit co presne aplikace dela vuci browseru a uzivateli – da se rict ze testy chovani aplikace za tebe aplikaci proklikaji.
      Nektere frameworky je samy obsahuji a casto ti jejich psani zjednodusuji na absolutni minimum – jako treba tady http://symfony.com/doc/current/book/testing.html#your-first-functional-test .

      – Existuji projekty, ktere ti umoznuji velmi snadno automatizovane testovat kazdy tvuj commit (pokud samozrejme pouzivas nejaky SCM jako je treba git).
      Takovym je treba https://travis-ci.org/ – vlevo muzes videt defakto v realtimu aktualne problehle testy a postupne se proklikat na jejich resume (zelene = success, cervene = failed) a dale primo na jejich vystup z command lajny.

      Jsou tam dokonce i nejakej ceske Nette buildy..

      Pokud nevis co je „dependency injection“, urcite ti neublizi, kdyz si najdes nejake skoleni, ktere se DI programovani tyka. Hodne se to tyka testovani jako takoveho a jsem si jistej, ze te to hodne posune.

      1. https://vladimirpilny.mojeid.cz/#2oFvdzWbch

        Re: Líbí se mi TDD, ale připadá mi to jen jako teorie

        Díky za podrobnou odpověď. Díval jsem se na první díl seriálu, takže je mi jasné, že jsem se ptal víc na integrační a funkční testy. Tak já tedy zkusím počkat na další díly a snad se dozvím odpovědi.
        DI opravdu nerozumím, ale popravdě mě ani moc netrápí, protože povětšinou neprogramuji OOP.

        1. jos

          Re: Líbí se mi TDD, ale připadá mi to jen jako teorie

          a pokud se odpovědi nedozvíš, tak hlavně prosimtě nechoď do diskuzí psát jak je automatizovaný testování naprd, protože tě k tomu nikdo nepřivedl za ručičku; s takovým přístupem se asi těžko naučíš něco novýho – začíná snad nějaký povídání o programovacím jazyce jinak než s hello world?

          PS: sorry za to jelítko, nemoh sem si pomoct

          PPS: TDD se má k testování asi jako způsob zvednutí auta k výměně kola

          1. https://vladimirpilny.mojeid.cz/#2oFvdzWbch

            Re: Líbí se mi TDD, ale připadá mi to jen jako teorie

            Rozdmýchávat flamy opravdu nechci, nebojte. Pravda, já se nechci učit NOVÉ věci, které se za mých studií na MFF ještě nevyučovaly, jen proto, abych ukázal, jak jsem moderní. Ale chci se učit řešit reálné problémy LÉPE. Takže doufám, že se dozvím, jak efektivněji testovat i komplexní chování.

            P.S. Stane se. :)

Napsat komentář

Tato diskuse je již příliš stará, pravděpodobně již vám nikdo neodpoví. Pokud se chcete na něco zeptat, použijte diskusní server Devel.cz

Zdroj: https://www.zdrojak.cz/?p=3718