Byla vydána beta verze openSUSE Leap 16. Ve výchozím nastavení s novým instalátorem Agama.
Devadesátková hra Brány Skeldalu prošla portací a je dostupná na platformě Steam. Vyšel i parádní blog autora o portaci na moderní systémy a platformy včetně Linuxu.
Lidi dělají divné věci. Například spouští Linux v Excelu. Využít je emulátor RISC-V mini-rv32ima sestavený jako knihovna DLL, která je volaná z makra VBA (Visual Basic for Applications).
Revolut nabídne neomezený mobilní tarif za 12,50 eur (312 Kč). Aktuálně startuje ve Velké Británii a Německu.
Společnost Amazon miliardáře Jeffa Bezose vypustila na oběžnou dráhu první várku družic svého projektu Kuiper, který má z vesmíru poskytovat vysokorychlostní internetové připojení po celém světě a snažit se konkurovat nyní dominantnímu Starlinku nejbohatšího muže planety Elona Muska.
Poslední aktualizací začal model GPT-4o uživatelům příliš podlézat. OpenAI jej tak vrátila k předchozí verzi.
Google Chrome 136 byl prohlášen za stabilní. Nejnovější stabilní verze 136.0.7103.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 8 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.
Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových
… více »Je mi to sice trochu proti srsti, je to jako smat se cizimu nestesti, ale nemuzu nevzpomenout na.Velmi dobrý odkaz, dovoli bych si zdůraznit: they are mainly about achieving software quality, not correctness Což samozřejmě je i částečný důvod proč je to celé kontroverzní: celý pojem "quality" je ve výoji software a programování kontroverzní. Opravdoví programátoři takové hovadiny neřeší.
Jsem k TDD skepticky. K Unit Testum uz mene, myslim, ze funkcionalni programovani je na to idealni, ale bohuzel to take nepraktikuji tak, jak bych si pral (=> zkusenost s tim nemam). Ale konceptualne nejsou unit testy vubec nove. Zejmena u programovacich jazyku a knihoven. Napriklad jisty interpretr Lispu z konce 80.let obsahuje unit testy (jako soucast dokumentace, pro kazdou funkci).Ono je to koneckonců jen logickým rozšířením klasického bottom-up/REPL vývoje, akorát rozšířeného o reprodukovatelnost (a samozřejmě rozšířeného pro kompilované jazyky bez REPL). Takže druhým zdrojem kotroverze je bottom-up, který je nepřirozený pro všechny odchované na top-down. A samozřejmě vůbec nepomůže, když se někdo do "těch unit-testů" pustí aniž by si právě tohle uvědomil (viz můj příspěvek o cargo-cult).
Opravdoví programátoři takové hovadiny neřeší.Chápu to správně, že opravdoví programátoři neřeší kvalitu svého kódu?
The alleged defining features of a "Real Programmer" are extremely subjective, differing with time and place, in the fashion of the "no true Scotsman" fallacy.Ten no true scotsman tady sedí víc než kde jinde.
Jsem k TDD skepticky. K Unit Testum uz meneJa bych sel klidne do vetsich extremu. TDD je blbost, na unit testy nedam dopustit. Unit testy je potreba pouzivat s nejakym nastrojem na code coverage, jinak je to k nicemu. Zrovna vcera jsem diky kombinaci unit testu a code coverage objevil chybu, kterou bych normalne neobjevil jen s unit testama neobjevil. Dalsi vyhoda unit-testu je v tom, ze kdyz je program pokryty unit testama, muze do programu zasahovat vic lidi, napr. zacinajici programator hned vi, ze nekde neco rozbil, cehoz by si bez toho mozna nevsiml.
myslim, ze funkcionalni programovani je na to idealni, ale bohuzel to take nepraktikuji tak, jak bych si pralV posledni dobe jsem zacal programovat i v jave ,,funkcionalne'', resp. zacal jsem intenzivne pouzivat immutable objekty a prijde mi, ze se tim spousta veci znacne zjednodusila.
Unit testy je potreba pouzivat s nejakym nastrojem na code coverage, jinak je to k nicemu.To zní jako další vtip v diskuzi. Code coverage nástroje jsou příjemný bonus, když si chce člověk ušetřit práci s hledáním zjevně nepokrytých částí programu, víc od toho nejde čekat. Nedá se říct, že by coverage nástroje byly tou zásadní částí testování.
když si chce člověk ušetřit práci s hledáním zjevně nepokrytých částí programnesouhlasim, code coverage nastroje jsou vyborny nastroj, ktery dokaze upozornit na casti kodu, u kterych neni zjevne, zda jsou pokyte nebo ne
u kterych neni zjevne, zda jsou pokyte nebo neMoje zkušenost říká, že jsou coverage nástroje schopné odchytit nepozornost (proto ji taky zavádím) a tím to asi tak končí. U zbytku testování se bohužel musí přemýšlet, aby to mělo nějaký smysl. Tedy pořád vidím coverage nástroje jako velmi milý bonus, nikoliv jako základní kámen testování.
To je právě ten cargo kult, o kterém tu už několik lidí psalo, tedy zaměňování nástroje s cílem.Kde zamenuju nastroj s cilem? Myslim, ze mi neco podsouvas. Mimochodem, vyse pisu, ze TDD je blbost (protoze IMHO testovani nemuze byt smyslem vyvoje softwaru.)
Pokrývání částí (skupin řádků) kódu je dobré tak maximálně ke splnění nějaké kvóty definované nějakým kravaťákem.To je blbost. Uz mockrat me code coverage upozornil na to, ze test nestuje vsechny varianty, co muzou nastat.
je potřeba pokrývat spíše funkcionalitu daného software a různé případy užití té funkcionality, než řádky kódu.Ale toto nejsou unit testy, o kterych si tu bavime! Smyslem unit testu je overit, ze zakladni kameny, na kterych stavis (metody, tridy), funguji tak, jak maji, nic vic, nic min.
Nepokryté řádky kódu často prozradí nějakou zapomenutou nepokrytou funkcionalitu,Myslim, ze davas rovnost mezi unit testy a testovani obecne, pricemz to prvni je pouze podmnozinou druheho.
Kde zamenuju nastroj s cilem? Myslim, ze mi neco podsouvas.Možná je to jen můj dojem. Mám za to, že jsi tvrdil, že unit testy bez coverage nástrojů jsou k ničemu. Osobně si to vysvětluju tak, že považuješ line coverage za hlavní cíl unit testů, zatímco já osobně považuju coverage reporty za nástroj, který v některých případech upozorní, že jsem něco přehlédl. Samozřejmě jsem tě mohl pochopit špatně.
Mimochodem, vyse pisu, ze TDD je blbostVzhledem k tomu, že i TDD považuju pouze za nástroj, nedává mi smysl o něm tvrdit, že je to nesmysl, maximálně tak že bývá často nesmyslně používán, ale o kterém nástroji toto nelze říci.
(protoze IMHO testovani nemuze byt smyslem vyvoje softwaru.)Nějak mi není jasná souvislost mezi faktem, že testování není smyslem vývoje, a smyslem či nesmyslem TDD.
Uz mockrat me code coverage upozornil na to, ze test nestuje vsechny varianty, co muzou nastat.Mně párkrát taky, což jsem mimochodem psal v předchozím příspěvku.
Ale toto nejsou unit testy, o kterych si tu bavime! Smyslem unit testu je overit, ze zakladni kameny, na kterych stavis (metody, tridy), funguji tak, jak maji, nic vic, nic min.Mám to chápat jako změnu názoru? Zvýrazněná část je totiž podstatou toho, co tu od začátku obhajuju.
Myslim, ze davas rovnost mezi unit testy a testovani obecne,To je docela zajímavý pohled. Testy s jemnější granularitou mají své výhody. Umožňují otestovat chování, které se ve větším celku zatím nepoužívá. Přesněji určují místo podezřelé z chyby. Poskytují ověřený příklad užití jednotlivých stavebních bloků. Dají se lépe svázat s vyřešenými chybami. Nic z uvedého mě ale nevede k přehodnocení názoru, že smyslem testů s libovolnou granularitou je testovat funkcionalitu, nikoliv pokrývat řádky. Běžně v projektech nechávám nepokryté řádky, pokud neodhalí nepokrytou funcionalitu. Coverage nástroje typicky spouštím když začínám mít pocit, že mám funkcionalitu pokrytou a hledám v nich, jestli jsem něco nezapomněl. Tedy jako doplňkový, nikoliv klíčový, nástroj. Můžeš tedy nějak rozvést, proč a v čem by měly být unit testy v tomto vnímány odlišně od všech ostatních testů (pokud ta hranice vůbec lze dobře definovat)?
Osobně si to vysvětluju tak, že považuješ line coverage za hlavní cíl unit testů,Vysvetlujes si to blbe. Bylo to mysleno tak, ze pokud mas testy a neprojedes to nastrojem na code coverage, tak nemas jistotu, jestli neco neprehledls, a to se stava dost casto. Navic v takove situaci muzes zit v blahove predstave, ze kdyz ta cast kodu prosla testy, tak by mela byt v poradku. Coz je snad jeste horsi, nez kdyby vubec testovana nebyla.
TDD považuju pouze za nástrojTed si odporujes. TDD dava jako hlavni smysl, aby program prosel testy, ... coz je presne to, proti cemus o prispevek vys brojils.
funguji tak, jak majiJa vubec zadne nazory nemenim. A hlavne vytrhavas veci z kontextu. Psal jsem smyslem unit testu je overit, ze zakladni kameny, na kterych stavis (metody, tridy), funguji tak, jak maji. A ty pises neco "je potřeba pokrývat spíše funkcionalitu daného software". Coz nejsou dve identicke veci.
Nic z uvedého mě ale nevede k přehodnocení názoru, že smyslem testů s libovolnou granularitou je testovat funkcionalitu, nikoliv pokrývat řádky.A to jsem nekde tvrdil?
TDD dava jako hlavni smysl, aby program prosel testyA tedy dělal to co měl, ne? Při vytváření testů si zároveň ujasňuji, upřesňuji funkcionalitu programu.
TDD dava jako hlavni smysl, aby program prosel test
Testy snad program musí projít i bez TDD, ne? Ale pointa TDD je v tom, že píšu nejdřív testy a až potom program.
Ale pointa TDD je v tom, že píšu nejdřív testy a až potom program.Pointa TDD je v tom, ze cely vyvojovy cyklus se prizpusobuje testovani. Coz muze mit pozitivni i negativni dusledky. Priklad z jineho soudku. Nedavno mi jeden clovek rekl, ze smyslem cviceni na vysoke skole je prece, aby ziskal zapocet. To, ze by se mel neco naucit, je jen vedlejsi dusledek.[1] A tato zvracena logika je prave pouzita v TDD. [1] V americe si na tom zalozila byznis spousta firem, ktere uci studenty techniky, jak projit testy typu SAT, GRE, aniz by jim davaly nejake hlubsi vedomosti.
Já to neobhajuji jen jsem chtěl upřesnit.
Ono TDD jsou dva druhy:
Tomu prvnímu se říká spíš BDD (Behavior-driven development) a když se mluví o TDD, myslí se tím spíš to druhé. A toto TDD staví na jednotkových testech – a jak jsem tu psal, tyto testy nesouvisí s požadavky zákazníků, jsou z tohoto pohledu irelevantní. Je to pomůcka pro vývojáře1 nikoli nástroj k dosažení kvality z pohledu zákazníka. Přesně jak píšeš – když zaškrtáš správné odpovědi v testu nebo odpovíš na otázky učitele (každý semestr stejné) v ústní zkoušce a projdeš – tak moc to nevypovídá o tvých znalostech a o splnění cíle z pohledu zákazníka2.
Že nějaká metoda vrací to, co si programátor (nebo i architekt nebo analytik) myslí, že by měla vracet není zárukou toho, že program jako celek bude dělat to, co požaduje zákazník. Míst, kde se to může vysrat3 je strašně moc a funkčnost jednotlivých jednotek (unit) prakticky nic neznamená – dokonce i nefunkční (neprocházející testem) jednotky můžou vést na dobrý výsledek (fungující celek – program). Buď proto, že v testu je chyba4 nebo proto, že je chyba na dvou místech a navzájem se vyruší a výsledek funguje (např. se hodnota někde blbě vynásobí dvěma a jinde zase blbě vydělí). Z tohoto pohledu dává větší smysl BDD a komplexnější testy (ne jednotkové), které ověřují funkci programu jako celku.
Ale ani tak bych to (Developer) TDD úplně nezavrhoval, dá se pro něj najít i smysluplné využití. Každopádně je to jen dílčí metodika nebo spíš bych řekl technika, která se použije v rámci jiné (všeobjímající) metodiky.
Jestli je to zvrácená logika je otázka. Občas se prý stane, že někdo v Indii napíše kód, který obsahuje pár IFů a vrací ty hodnoty, které od něj test očekává, aniž by plnil tu skutečnou funkci, kterou plnit má. Napsat dokonalý test, který by byl proti tomu imunní, prakticky nejde. Stejně se nakonec dělají revize kódu, ale je lepší mít kolegy, kteří se o takové podvody ani nebudou pokoušet. Ale v kultivovaném prostředí je to něco jiného a může to být k užitku – místo abys měl analýzu a v ní příklady jako text, tak můžeš rovnou dostat i testy – v podstatě je to ta samá informace, jen ve strojově čitelné a spustitelné podobě. Jak jsem tu někde psal – test jako forma komunikace (ne jako nástroj pro dosažení kvality).
[1] někdy i celkem užitečná, protože může např. usnadnit zadávání práce méně zkušeným kolegům
[2] kterým jsi tady vlastně ty a cílem je příprava na budoucí zaměstnání (pokud ti nejde jen o ten papír)
[3] volání těchto metod, chyby ve frameworcích a knihovnách třetích stran nebo nepochopené jejich API, špatná výchozí konfigurace a ukázkové soubory, špatné volby kompilátoru, špatně deklarované závislosti na jiných balíčcích, chyby v pomocných skriptech, nekompatibilita s verzí OS, jazykovou mutací nebo výchozím kódováním, špatná dokumentace atd.
[4] on i test je vlastně programem
Ja si myslim, ze cisar, ktery ma na sobe ty unit-test saty je nahy.Existuje speciální termín který shrnuje celý problém: cargo-cult. Tato metafora se mi obzvláště líbí protože lze na ní krásně demostrovat bláhovost vášnivých disputací cargo-kultistů s cargo-ateisty. Totéž platí i pro jiné kulty, jako jsou například design patterns či object-oriented.
Kdyz mluvim s nekym, kdo musi opravdu programovat a taky se tim zivit, tak ten zadne unit testy nedela.To je pravda. Když totiž člověk dělá testy, tak to omezí množství chyb, které by pak mohl řešit a tím pádem se vlastně připravuje o práci ;). Dnes a denně můžu srovnávat uživání testovaného i ne tak dobře testovaného software a sledovat další uživatele, jak při instalaci každé nové verze trnou, co všechno se rozbije. Někdy to vede až k tomu, že dávají přednost zakonzervovaným verzím s více či méně známými chybami než aby se nechali překvapit, kolik věcím jim zase přestane fungovat.
Ja si myslim, ze cisar, ktery ma na sobe ty unit-test saty je nahy.To rozhodně. Testy jsou nástroj, nikoliv cíl a výsledek závisí na tom, jak se ten nástroj používá. Když vezmu do ruky kleště, tak to taky ze mě nedělá elektrikáře.
Dnes a denně můžu srovnávat uživání testovaného i ne tak dobře testovaného software a sledovat další uživatele, jak při instalaci každé nové verze trnou, co všechno se rozbije.
Mluvíš o jednotkových testech nebo o testech obecně?
Pokud děláte něco malého, UT možná nepotřebujete. V dobře vedeném velkém projektu jsou k nezaplacení.
Ono nejde až tak o velikost projektu, jako spíš o to, co těmi jednotkovými testy pokrýváš. Když jsou to nějaké tvoje vlastní třídy/funkce, které přijímají a vracejí nějaké tvoje struktury nebo primitivní datové typy a mají uvnitř nějakou netriviální logiku (tzn. jednoduché rozhraní + složitý vnitřek), pak jednotkové testy dávají velký smysl a jsou hodně užitečné.
Pokud ale ten testovaný subjekt má spíše jednoduchou vnitřní logiku a ta složitost je v interakci s okolím (frameworky, knihovny, síťové protokoly, souborové formáty…) a ty tohle okolí v testech musíš simulovat, mockovat, tak ten smysl unit-testů je hodně malý a někdy i záporný (zbytečná práce). Nic ti nezaručí, že jsi ta složitá rozhraní nasimuloval správně a procházející unit-test nic neznamená – je to úplně odtržené od reality, ve které ten program pak bude fungovat. Jde např. o to, jak máš inicializovat okolní objekty, v jakém pořadí máš volat jejich metody, jaké jsou přípustné hodnoty (že jde např. někam podle signatury metody poslat String
neznamená, že tam můžeš poslat jakýkoli String
), jestli může být vstupem/výstupem i null
nebo prázdná kolekce či řetězec nebo tam musí „něco“ být, jestli je bezpečné s tím pracovat z více vláken, za jakých okolností si z těch objektů můžeš vytáhnout určité vlastnosti a za jakých tam bude null
nebo vyhodí výjimku atd. atd. Teoreticky bys měl mít dokonalou (aktuální a kompletní) dokumentaci/specifikaci všeho a měl bys být schopný podle toho to prostředí v testech nasimulovat – ale to by jednak dalo hodně práce (v podstatě bys ten okolní software musel napsat podruhé) a jednak ty tu dokonalou dokumentaci většinou nemáš.
Dade, to co teď píšete je, sorry, děsná kravina.to mi mrzi a ja se budu snazit, aby se to uz neopakovalo.
Na světě jsem už byl, ale první program jsem napsal o pár let později (jen na kalkulačce) a první v C asi za 8 let.
A pro C++ mám vlastni řešení třída+preprocesor-macra (bohužel ne přímo thread-safe, ale používám to i v multi-thread) a ke každé třídě/jednotce, která má funkci knihovny vytvořím unit test (jednoduchým copy&paste a přepsání na dvou místech). A pak tam sjedu funkcionalitu, kterou stejně potřebuji odzkoušet a doplním s rozumem test limitních vstupů.
A takto to pro mě má okamžitý smysl už pro ověření funkčnosti(, stejně bych dělal nějaký malý main()
), pak to má to smysl, že se to donutí lépe zamyslet nad limitami a rovnou je otestovat (- s rozumem), a má to smysl jako základ profilování, už tam odzkouším výkonově kritické chování (prostě to změřím a porovnám), dále to plní funkci doc-by-example, a pokud jsou třídy nějak provázané, tak při jakékoliv následné úpravě po projetí všech testů mám velmi slušnou šanci, že to nic nenabořilo (ano, měl bych ji mít už by-design, ale ne vše je křišťálově čisté a každé zadání i hned přesné).
A když mám použít nějakou knihovnu a žádně testy tam nejsou, tak přemýšlím, jestli autor vůbec ví jak se to chová, a pokud to ví autor, je to hezké, ale já si to musím ověřit a nějaké testíky smolím.
Podle mě, psát to na cokoliv včetně např. datové třídy, je úlet…
Přijde mi logické, že velká firmy a velké týmy na tom staví, je to hezký nástroj ke kontrole předávaných-sdílených kódů a může být super, když je (unit testy) navíc vytvoří někdo jiný, jen dle dokumentace.
Ano i ne.
Jednotkové testy ti pomůžou při týmové práci, když potřebuješ rozdělit úkoly mezi lidi – testy jsou formou komunikace a umožňují vyvíjet část programu už ve chvíli, kdy k ní ještě neexistuje ten protikus. Nebo když kompilace celého programu, instalace a restart trvají dlouho, tak s jednotkovým testem si můžeš ladit nějakou malou část a pouštět si to pořád dokola, než to bude ok, a pak to teprve vyzkoušíš v rámci celku. Pak samozřejmě taky pomohou odhalit nějaké ty chyby, ale tuhle vlastnost bych nepřeceňoval (vzhledem k požadavkům zákazníka/uživatele jsou unit-testy irelevantní, mimoběžné – je to pomůcka pro vývojáře, ne nástroj pro dosažení kvality požadované zákazníkem).
A na druhou stranu: když se z toho stane dogma (100% pokrytí, unit-testovací fetišismus), tak spíš škodí. Taky můžou vést k iluzi „máme jednotkové testy → máme otestováno“ což je samozřejmě nesmysl (pokrytí testy a jejich průchod nevypovídá nic o kvalitě z pohledu zákazníka/požadavků).
pokrytí testy a jejich průchod nevypovídá nic o kvalitě z pohledu zákazníka/požadavkůInterní testování především není o průchodu ani o pokrytí, ale o tom, abysis u zákazníka neudělal ostudu, ať už kvůli tomu, že selhává zcela základní funcionalita a program nelze třeba ani předvést, nebo se ti třeba vrátí chyba, kterou jsi zákazníkovi slíbil vyřešit a teď to vypadá jako bys ji nevyřešil. Na to jsou obecně vhodnější testy s hrubší granularitou než jsou funkce a třídy, ale neplatí to vždy. Někdy je dobré hrubším testem kontrolovat nějakou funkcionalitu a jemnějším testem kontrolovat třeba různé pluginy, které může zákazník použít a pro které nemáš třeba připravený setup, takže se nakonec dostaneš až na úroveň právě toho unit testu. Především, už to někdo určitě psal, nemít chyby v novém kódu nebývá hlavní motivací psaní automatizovaných testů.
Přijde mi, že máš dost podivně definované pojmy (zákazník vs. uživatel vs. kolega; jednotkový test vs. automatizovaný test vs. testování obecně). Někdy se k tomu třeba rozepíšu trochu víc…
Přijde mi, že máš dost podivně definované pojmyPojem interní zákazník se zavádí ve chvíli, kdy dotyční nejsou kolegové ve smyslu, že bysis s nimi mohl kdykoli sednout na oběd a domluvit se, ale z nějakého důvodu s tebou komunikují přes jejich a tvůj management a řeší se s nimi v podstatě stejné věci jako s externími zákazníky, pokud vynecháš obchodní stránku. Uživatel knihovny je z mého pohledu ten, kdo knihovnu používá, tedy vývojář programového celku, který knihovnu linkuje. Máš na to nějaký jiný názor? Jednotkové a automatizované testy máme předpokládám definované úplně stejně. Zbytečně se necháváš zmást (stejně jako deda.jabko) tím, že v některých případech vynáším obecnější tvrzení a tudíž v celku logicky použiju obecnější pojem. Navíc nejsem ohledně testů dostatečně náboženský, takže se stává, že při testování stejných věcí volím mezi čistými jednotkovými testy a testy s libovolně hrubší granularitou, protože je pro mě z nějakého důvodu nepraktické snažit se funkce, třídy či moduly izolovat. Může se tak stát, že úplně stejně napsaný testovací kód nesplňuje podmínky pro unit testing jen proto, že nemám namodelované prostředky, které daný modul používá. Pak se granularitou i záběrem jedná o integrační test toho modulu, který se ale při absenci jednotkového testu používá i k otestování modulu samotného.
Co je interní zákazník, vím bohužel až moc dobře ale zpět k tématu. Když někdo používá tvoji knihovnu, nezajímají ho jednotkové testy, které ověřují funkčnost1 nějakých interních jednotek zdrojáků (white box), jeho zajímají integrační/systémové testy, které k testovanému subjektu (knihovně) přistupují zvenku (black box) a ověřují implementaci API na základě nějakého kontraktu (specifikace). Pro něj je klíčové, aby se knihovna navenek chovala konzistentně (např. mezi verzemi nebo při změně okolního prostředí), ale vůbec ho nezajímá, jestli interní metoda/funkce např.
xyz()
schovaná kdesi uvnitř kódu knihovny vrací true
nebo false
.
Něco jiného je, když si ten člověk začne číst zdrojáky té knihovny a pocítí touhu tam něco změnit – pak mu jsou jednotkové testy k užitku – ovšem v tu chvíli je v úplně jiné roli: není to zákazník nebo uživatel, ale je to tvůj kolega – spolutvůrce toho softwaru (knihovny) a v této roli logicky jednotkové testy ocení. Po tom, co se dohodnete na začlenění jeho změn, může se zase přepnout do role uživatele a brát knihovnu zase jako černou skřínku odpovídající specifikaci a poskytující nějaké veřejné API. Ty role si můžeš přepnout klidně několikrát za den, ale to nic nemění na tom, že jednotkový test je zajímavý pro roli programátora/autora, nikoli pro uživatele/zákazníka.
Může nastat i specifický případ, kdy po tobě platící zákazník bude chtít jednotkové testy (a spoustu dalších věcí jako konvence, dokumentace atd.), protože chce převzít tvoje zdrojáky a pokračovat ve vývoji – ovšem to je taková hybridní role: zákazník/zaměstnavatel/uživatel/kolega/spoluautor a ta potřeba jednotkových testů vychází právě z té role kolega/spoluautor, nikoli zákazník/uživatel.
A ještě se musím vrátit k tomuto, protože mi přijde, že ses chytil toho zákazníka/uživatele a úplně přehlédl ty požadavky:
vzhledem k požadavkům zákazníka/uživatele jsou unit-testy irelevantní, mimoběžné
Pointa byla v tom, že mít 100% pokrytí jednotkovými testy a mít všechny zelené, neříká nic o tom, že byly splněny požadavky zákazníka. Procházející unit-testy o tom nevypovídají vůbec ale vůbec nic, protože je psal programátor na základě toho, jak pochopil zadání – a na základě téhož pochopení (či nepochopení) zadání psal i ten samotný program – tudíž je dost velká šance2, že kód a jednotkové testy budou v souladu. Ale bude v souladu i kód a zadání? O tom unit-testy nevypovídají zhola nic! Tady musí nastoupit nezávislí testeři, kteří ověří funkcionalitu3 na základě zadání (analýzy, specifikace, požadavků zákazníka) a to právě formou integračních/systémových (nikoli jednotkových) testů.
Rozdíl mezi těmito druhy testů není jen v té – jak ty říkáš – granularitě, ale hlavně v tom, kdo a proč je píše.
[1] často nejde ani o ověřování funkčnosti, jako spíš o metodu a pomůcku při psaní kódu nebo nástroj k udržení integrity při refaktoringu a dalších změnách – uživatelem (a zároveň autorem) tohoto testu je programátor, nikoli tester nebo nedejbože zákazník (v tvém případě uživatel knihovny)
[2] téměř jistota, protože padající jednotkové testy si programátor většinou vychytá u sebe a nepustí neprocházející kombinací kód+testy ze své pracovní stanice k ostatním
[3] a další požadavky jako třeba výkon, robustnost…
Procházející unit-testy o tom nevypovídají vůbec ale vůbec nic, protože je psal programátor na základě toho, jak pochopil zadání – a na základě téhož pochopení (či nepochopení) zadání psal i ten samotný program – tudíž je dost velká šance2, že kód a jednotkové testy budou v souladu. Ale bude v souladu i kód a zadání? O tom unit-testy nevypovídají zhola nic!
Ještě takový příklad: když zapomeneš implementovat funkcionalitu z požadavku #1234 tak se to na jednotkových testech neprojeví vůbec nijak – všechny budou krásně procházet a budeš mít 100% pokrytí – jednoduše proto, že jednotkové testy píšeš pro jednotky – a dané jednotky (třídy/funkce), které by tu funkcionalitu měly implementovat, vůbec neexistují.
Jestli chceš otestovat soulad s požadavky, tak na to musíš jít ze strany těch požadavků a testy odvozovat z nich – ne ze strany kódu, který programátor napsal (dodatečně psané jednotkové testy) nebo který má v úmyslu napsat (TDD).
Dokud si nepřečteš to, co jsem doteď napsal, tak nemá cenu abych přidával cokoli dalšího, nerad bych tě zahltil textem
Ty jsi reagoval na moji větu:
pokrytí testy1 a jejich průchod nevypovídá nic o kvalitě z pohledu zákazníka/požadavků
tak jsem se ti snažil vysvětlit, jak jsem to myslel.
[1] což bych prosil nevytrhávat z kontextu – jsou jím myšleny jednotkové testy
--TEST-- strtr() function - basic test for strtr() --FILE-- <?php $trans = array("hello"=>"hi", "hi"=>"hello", "a"=>"A", "world"=>"planet"); var_dump(strtr("# hi all, I said hello world! #", $trans)); ?> --EXPECT-- string(32) "# hello All, I sAid hi planet! #"Jsou zde tři sekce (umí to však mnohem víc): První je název testu, pak je samotný testovací/testovaný kód a na závěr očekávaný výstup. Pro použití v C by se to muselo udělat trošku jinak, ale možná by se dal preprocesor ukecat i k něčemu velmi podobnému. Během testů je vytvořeno několik souborů a pokud test projde, tak jsou zas zlikvidovány. Pokdu neprojde, zbydou soubory obsahující diff, aktuální výstup a samostatný zdrojový kód. Testy spouští nástroj, který parsuje soubor s testem, vyrobí dočasné soubory, spustí PHP, zkontroluje výstup a uklidí. Tento přístup má obrovskou výhodu v tom, že psaní testu lze snadno využít k ladění rozepsaného programu. Tím, že výstupem je text a nikoliv banda assertů, je daleko jednodušší sledovat, co z programu skutečně leze. A jakmile je výsledek uspokojivý, stačí hu uložit jako referenční. Psaní složitých assertů tak zcela odpadá.
Tento přístup má obrovskou výhodu v tom, že psaní testu lze snadno využít k ladění rozepsaného programu. Tím, že výstupem je text a nikoliv banda assertů, je daleko jednodušší sledovat, co z programu skutečně leze. A jakmile je výsledek uspokojivý, stačí hu uložit jako referenční. Psaní složitých assertů tak zcela odpadá.To je otázka názoru. Mně zase přijde přehlednější, když je hned vedle sebe skutečný výsledek a ten očekávaný. A nemusím v tom (potenciálně dlouhém)
--EXPECT--
hledat, který řádek odpovídá kterému. Další věc je, že tohle není platný PHP kód, takže to může rozbít nápovědu v editoru apod. Ale uznávám, že tenhle způsob má i dost výhod.
--TEST-- strtr() function - basic test for strtr() --FILE-- string(32) "# hello All, I sAid hi planet! #" --EXPECT-- string(32) "# hello All, I sAid hi planet! #"
Dostaneš diff, kde už to je nalezené.Já měl na mysli případ, kdy ten test chci rozšířit. Jinak souhlasím.
Já preferuji poněkud jiný styl testů. V podstatě to spočívá ve výpisu na standardní výstup a udělání diffu oproti očekávanému výstupu.Hezké. To v jednom případě skutečně používám.
Tento přístup má obrovskou výhodu v tom, že psaní testu lze snadno využít k ladění rozepsaného programu. Tím, že výstupem je text a nikoliv banda assertů, je daleko jednodušší sledovat, co z programu skutečně leze.Samozřejmě to má i své nevýhody, takže to kombinuju s testováním pomocí assertů, které slouží k prostému odchytání regresí. Ty asserty mají obrovskou výhodu v tom, že program sletí ve chvíli, kdy je něco vyhodnoceno jako špatné a tím pádem se dá s pomocí debuggeru bleskově zjistit, co se vlastně stalo. Akorát v tomto případě nepoužívám žádný framework, protože mi jednak přijde redundantní (nevidím pro něj potřebu) a jednak by v kódu překážěl ve chvíli, kdy chci kód testu použít zároveň jako ukázku (s asserty jsem v tu chvíli celkem smířený).
"Asserty" jsem myslel ty, které se používají v těle testuCo jsem odkazoval, je tělo testu. Nicméně to, že test vypadá jako běžný program a lze používat jako ukázka pro uživatele knihovny, považuju za výhodu.
Tiskni
Sdílej: