Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Filip Jirsák

Stran: 1 ... 211 212 [213] 214 215 ... 375
3181
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 16:41:21 »
Citace: Filip Jirsák
Kdybych to psal v dynamickém jazyku, tak asi proto, abych typy nemusel řešit a poradilo si to s co největší škálou různých (i ne zcela správných) vstupů.
...
To by mě zajímalo, proč bys zrovna z těchto důvodů tohle psal v dynamickém jazyku....
Že je to dynamický jazyk přece bylo vaše zadání.
Nějak nerozumím vašemu logickému uvažování. Giving up.

Začalo to takhle:


Máš pravdu, když to píšu, tak to píšu bez přemýšlení... až na to, že tohle je kód, který je dost důsledně kontroluje, jestli ve zdrojových datech nechybí atributy, jestli to pole "delta" je fakt neprázdné, jestli tam někde nejsou nully.... a teď mi řekni, jak bys to psal v dynamickém jazyku a jak by vypadaly unit testy....

3182
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 15:02:01 »
To by mě zajímalo, proč bys zrovna z těchto důvodů tohle psal v dynamickém jazyku....
Že je to dynamický jazyk přece bylo vaše zadání. Kdybych chtěl kontrolovat, že jsou tam správné typy, budu to kontrolovat, a jednotkové testy budou dělat to, že budou mít vstupy s různě pokaženými typy a budou testovat, že funkce pro načtení dat skončí správnou chybou. Pak vůbec nezáleží, jaký je typový systém, protože třeba v souboru na disku můžu mít ta data jakákoli, a při načtení musím kontrolovat, že načítaná data jsou validní.

já fakt nesouhlasím s:
Citace
To záleží na kontextu. Pokud se bude pohybovat v kódu, kde bude většina typů non-null, a výjimečně narazí na nullable typ, ošetří to. Pokud bude z venku neustále dostávat nullable typy a použité typy a typový systém ho budou nutit neustále to přetypovávat, bude to dělat automaticky bez přemýšlení.
a řekl bych že výše uvedený příklad ukazuje, že to prostě není pravda.
Podle mne se tady nedá na jednom příkladu ukázat, že to není pravda. Vždyť tvrdím, že když donutíte člověka něco dělat opakovaně skoro pokaždé v nějaké situaci, bude to v podobných situacích dělat bez přemýšlení. To je úplně nezávislé na programování, lidé takhle automaticky odklepávají potvrzovací dotazy, pokud se jich aplikace pořád ptá na nějaké nesmysly (třeba jestli má smazat soubor), vjíždí na železniční přejezd, když nebliká červená – a úplně stejně budou do programu automaticky vkládat konstrukci na přetypování na non-null typ, pokud to tak budou používat ve většině případů. Jako příklad budiž třeba implementace escapování jako obrany před SQL injection nebo XSS – pokud se to někde nechalo tak, že si to musel každý ve svém kódu ošetřit sám, bylo vzápětí escapování všude, takže se jeden řetězec escapoval několikrát (což samozřejmě nefungovalo). Dotyčný autor nad tím vůbec nepřemýšlel, jestli je v kontextu kdy musí nebo nesmí escapovat, prostě tu konstrukci bez rozmýšlení mydlil všude.

A ze stejných důvodů nesouhlasím s tímto:
Citace
I tenhle typ chyby se bude objevovat u sebelepšího typového systému, protože když programátora nenapadne, že to je zajímavý případ a měl by na to udělat test, nenapadne ho ani ošetřit to v typovém systému.
Protože například u té nullpointerexception je prostě používání "Maybe" typu na úplně jiné úrovni než dávat někam asserty a psát k tomu unit testy.
Rozlišování nullable/non-null typů je myslím extrémní případ, kdy je použití extrémně snadné a pro programátora srozumitelné. Souhlasím s tím, že tohle je případ, kdy je řešení pomocí typů nejlepší řešení. Ale jen o málo složitější věci by typově správně byly nesmírně komplikované, a nebo tam zase musíte povolit potenciální chyby, a programátor to neuhlídá.

Zkuste vzít jako příklad jednoduché porovnání dvou čísel splňující kontrakt „pokud je první číslo větší, vrací zápornou hodnotu, pokud jsou stejná, vrací nulu, pokud je druhé číslo větší, vrací kladnou hodnotu“. Nejjednodušší řešení je čísla odečíst – jenže se může stát, že dojde k přetečení. Může se to ošetřit typově – při sčítání nebo odčítání dvou čísel bude mít návratový typ dvojnásobný rozsah. Jenže se to začne nabalovat, a za chvíli skončíte s datovým typem, který se ani nevejde do paměti. A nebo to budete ošetřovat a pokud by došlo k přetečení typu, vyhodí se výjimka. Jenže pak zase potřebujete jednotkové testy, protože typový systém by vám možná zajistil, že program neudělá skrytě nic špatně, ale raději vyhodí výjimku, ale testy pak potřebujete na to, abyste zkontroloval, že aspoň někdy to skončí jinak, než výjimkou.

3183
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 13:42:53 »
Citace: andy
Jinak pokud jde o XSS, tak bych neřekl, že je to principálně věc typů.
Beru zpět, ano XSS jde řešit typy a zrovna docela hezky.
odkaz by nebyl?
Jakub Vrána mluvil na Devel.cz o tom, jak to dělají v Googlu – Dokazatelná bezpečnost.

3184
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 13:39:46 »
Máš pravdu, když to píšu, tak to píšu bez přemýšlení... až na to, že tohle je kód, který je dost důsledně kontroluje, jestli ve zdrojových datech nechybí atributy, jestli to pole "delta" je fakt neprázdné, jestli tam někde nejsou nully.... a teď mi řekni, jak bys to psal v dynamickém jazyku a jak by vypadaly unit testy....
Kdybych to psal v dynamickém jazyku, tak asi proto, abych typy nemusel řešit a poradilo si to s co největší škálou různých (i ne zcela správných) vstupů. Podle toho by vypadaly i jednotkové testy – poslal bych do toho JSON, kde by chyběly položky, místo Intu by tam bylo číslo jako text, text nepřevoditelný na číslo, null…

3185
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 13:36:56 »
z jakých materiálů jste čerpal? popř. v jakém jazyce jste to zkoušel?
„Ale to je magnétismus, to je úplně nová fyzika, nechoďte na mně s nějakým zastaralým zákonem o zachování energie. Říkám vám, že mi to funguje, jenom maličko točit klikou musíte, ale to se doladí, to už jsou jenom takové maličkosti, jenom najít ten správný mazací olej…“

3186
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 12:51:08 »
a jste si jistý, že ten současný stav poznání máte podchycený? teď narážím na "dependent types"
Ano, jsem si tím jistý.

V různých dobách se perpetua mobile vytvářejí na základě v té době moderních věcí – někdy to byl „magnétismus“, někdy „paprsky X“, jindy „elektřina“, dneska to často budou „kvantové jevy“, „energie vakua“ nebo nejnověji nejspíš „temná hmota“. Což nic nemění na tom, že nemožnost konstrukce perpetua mobile plyne z fundamentálních zákonů, a nemusíme znát detailní fungování temné hmoty, nemusíme mít sjednocenou teorii gravitace a kvantové teorie, nemusíme tušit, co se ve fyzice objeví za padesát nebo za sto let, pořád si ale můžeme býti dost jistí, že ani pak nepůjde zkonstruovat perpetuum mobile.

Stejně tak si můžeme být dost jistí, že nepůjde mechanicky zkontrolovat, zda program bude fungovat správně – například i proto, že „správné fungování“ je subjektivní věc, a co může být v jednom případě považováno za správné fungování, v jiném případě tak být nemusí.

Pak je podstatná ještě jedna věc, která tu zatím moc nebyla zmíněna, a to je to, že typový systém může něco užitečného přinést jedině tehdy, když se používá, tedy když ho programátoři chtějí používat. Stačí se podívat na takové malinké vylepšení hloupého typového systému Javy, jakým jsou kontrolované výjimky. Ani tohle drobné typové omezení se prakticky neujalo, a to je velmi jednoduché kontrolované výjimky jak definovat, tak používat. I to připadá většině Java vývojářů jako zbytečně moc práce v porovnání s jejím přínosem. Takže navrhovat nové typy pro masové použití klidně můžete, ale pak se vám také klidně může stát, že budou vznikat a široce se používat knihovny, které budou jako jednu ze svých důležitých vlastností uvádět to, že ruší ten váš typový systém.

3187
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 12:33:16 »
To se mi nějak nezdá - 100% pokrytím někteří myslí pokrytí celého protokolu objektu, tj. viditelných metod. Že testy nespustí některý vnitřní kód, nemusí znamenat vůbec nic, např. část kódu je nevyužitá (např. před refaktorizací). Nebo si představte, že vytvoříte testy cizí knihovny, do které vůbec nevidíte.
Pokrytí všech instrukcí kódu je to jediné, co se dá relativně snadno změřit, proto to bývá jedna z metrik, které se měří při sestavení projektu. Takže když na nějakém výstupu (třeba od https://codecov.io/) uvidíte metriku „pokrytí testy“, je to právě tohle. Jinak samozřejmě „pokrytí testy“ může znamenat i ledacos jiného, pak by ale každý, kdo to spojení použije, měl uvést, co tím vlastně myslím. Jinak to dopadne jako tady, kde se několik lidí hádá o pokrytí testy, a přitom tím každý myslí něco jiného.

3188
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 12:28:11 »
Tak bych si dovolil tvrdit, že programátora v jazyce s ADT null pointer exception chybu řešit fakt napadne, protože tam jinak ten "null" nedostane, zatímco u assertu toho programátor fakt mnohokrát nenapadne tam ten assert vůbec dát.
To záleží na kontextu. Pokud se bude pohybovat v kódu, kde bude většina typů non-null, a výjimečně narazí na nullable typ, ošetří to. Pokud bude z venku neustále dostávat nullable typy a použité typy a typový systém ho budou nutit neustále to přetypovávat, bude to dělat automaticky bez přemýšlení.

Takže bych to upřesnil, že komplexnější typový systém sám o sobě nic nezaručuje, pouze dává větší možnosti. A je na jeho uživatelích, zda ty možnosti využijí – přičemž je potřeba počítat i s tím, že (i podle typů projektů) je různá úroveň programátorů, a nedá se počítat s tím, že ty miliony webových aplikací budou programovat lidé, kteří budou důsledně používat složitý typový systém – bylo by to příliš drahé. Je ale dobré, když se podaří (jako to má třeba Google) využít typový systém v důležitých částech tak, že ty typy nadefinují specialisté, a řádový programátor pak už jen používá typy „obyčejný text“ (který nemůže do HTML vypsat jinak, než escapovaně), a typ „HTML text“, který se při výstupu do HTML neescapuje, ale zase v něm není možné vytvořit nebezpečnou HTML konstrukci (např. náchylnou na XSS).

Takže konkrétně nullpointerexception mi připadá jako protipříklad Tvého tvrzení, a nepřipadá mi, že by cokoliv, co jsi napsal poté (byť třeba s tím odstavcem výše souhlasím) jakkoliv tu ideu, že typový systém a unit testy jsou srovnatelné, protože v obojím může udělat programátor chybu, podporovalo.
Já ale netvrdím, že typový systém a jednotkové testy jsou srovnatelné. Tvrdím, že naopak každý řeší něco jiného, takže obecně nejsou navzájem nahraditelné – i když existuje určitá oblast, kterou je možné řešit oběma způsoby, a když používáte slabší typy, je vhodné danou oblast kontrolovat pomocí jednotkových testů. Jako v tom příkladu s XSS – kdo nepoužívá typy pro bezpečné HTML, jako Google, měl by mít alespoň jednotkové testy snažící se XSS odhalit (což je zrovna dost obtížné a podle mne je snazší řešit to pomocí těch typů).

3189
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 11:21:32 »
mj. jsem narážel na to vaše "sebelepší typový systém nemůže..."
To ale není odmítání moderních technologií nýbrž pouhé konstatování faktu. Když mne někdo bude přesvědčovat, že má vymyšlený stroj, do kterého nemusí vkládat žádnou energii a ten stroj jí vyrábí, a že už mu to skoro funguje, jenom ještě dořeší nějaké detaily, odmítnu to. Ne proto, že bych odmítal moderní technologie, ale proto, že podle současného stavu poznání perpetuum mobile nelze vyrobit.

3190
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 10:46:34 »
Typ Maybe fakt není assert.
Nic takového jsem nepsal. Napsal jsem, že „null pointer exception“ můžete řešit pomocí typů (mít typ, který NIL hodnotu nepřipustí), pomocí assertů (typ připouští NIL, ale na vstupu deklarujete pomocí assertu, že NIL je neplatná vstupní hodnota) a můžete to ošetřit testem (který NIL hodnotu pošle na vstupu a otestuje, zda se kód zachová očekávaným způsobem). To jsou různé způsoby zápisu kódu, a druhá věc je, co s tím pak dělá kompilátor. U typů je to nejjednodušší, tam se tak nějak očekává, že kompilátor tuto informaci použije. Ale kompilátor může použít i jiné informace, třeba z anotací nebo právě assertů – třeba IntelliJ Idea dělá analýzu kódu (je to obohacený kompilátor) a na základě toho odvozuje, zda se jedná o nullable nebo non-null typ. Takže ve zdrojovém kódu ten typ není uveden, při kompilaci se pomocí type inference odvodí, ale pak se dostane ke slovu type erasure a do zkompilovaného kódu se informace o typu opět nedostane (resp. je tam obecnější nullable typ).

Pokud programátor napíše "int x = (unsafeCoerce) 'string'", tak ho fakt nic nezachrání. Ale řekl bych, že je dost velký rozdíl mezi tímto a jazykem, kde člověk může napsat akorát "x = 'string' # comment: x je typu int".
Někdy v tom je velký rozdíl a někdy prakticky žádný. Existují různé problémy, takže i nástroje k jejich řešení jsou různé. Na něco se hodí programovací jazyk s bohatým typovým systémem, na něco typy vůbec nepotřebujete.

3191
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 10:26:40 »
trochu offtopic, ale nemáte někdo nějakou teorii tohohle vehementního odmítání moderních technologií?
Nevšiml jsem si, že by tu někdo odmítal moderní technologie. Vidím tu jen nekritické přijímání něčeho, čemu dotyčný moc nerozumí, ale je to pro něj nové (ve skutečnosti to ale ani nic nového není), a má pocit, že to vyřeší všechny problémy světa. Na technologiích není důležité to, jestli jsou nové, ale jaké problémy umí (doopravdy) řešit.

3192
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 10:21:35 »
...Stoprocentní pokrytí kódu testy znamená, že se při testech projdou všechny „řádky“ (ve skutečnosti instrukce) programu...

Toto je chybné tvrzení. Vy sám jste napsal, že testy nesmějí obsahovat algoritmus, neboli duplikovat implementaci. Úkolem testů není ověření samotné implementace, ale ověření správnosti výstupů pro všechny kombinace možných vstupů, to je 100% pokrytí testem. To je ale obvykle nereálné, takže alespoň jejich části.
To spolu ale nesouvisí. Testy mohou pokrývat 100 % kódu, tj. při spuštění testů se spustí všechny instrukce kódu. To ale vůbec neznamená, že by test duplikoval implementaci. Za „pokrytí testy“ se obvykle označuje právě poměr počtu instrukcí procházených při testech k celkovému počtu instrukcí knihovny či aplikace, protože to se dá změřit. To je reálné (i když to nemusí být nutné, protože chybějící testy mohou nepokrývat nezajímavé části kódu), ale v žádném případě to neříká, že by se testovaly všechny možné vstupy, nebo že by program byl bezchybný, pokud testy projdou. Ukazatel „pokrytí kódu/řádků/instrukcí testy“ má opačný význam – pokud určitá větev programu není testem pokrytá, víme určitě, že pomocí testů určitě nedokážeme poznat, zda v dané části chyba je nebo není.

3193
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 10:13:31 »
Pokud testy prochází a program přitom nepracuje správně, nemohu tvrdit, že má 100% pokrytí testy.
Ke slovesu pokrytí se váže předmět – tedy pokrytí čeho. Nemá smysl se tady dohadovat a neustále používat nevyjádřený předmět, když je zřejmé, že každý za předmět považuje něco jiného. Obvykle se „pokrytím testy“ myslí pokrytí kódu, tedy 100% pokrytí testy by znamenal pokrytí všech řádků/instrukcí. Které samozřejmě nezaručuje skoro nic, rozhodně nezaručuje bezchybnost. Vy asi myslíte 100% pokrytí všech možných případů, což je u jenom trošku větších věcí nedosažitelné.

3194
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 10:09:34 »
Až na to, že pokud algoritmus něco složitého "počítá", tak není moc šance na to psát unit test buď tak, že ten algoritmus implementuje někdo jiný/jinak, nebo tak, že se prostě výsledek algoritmu vezme jako že je "správně". Ono to má své opodstatěnění, při refaktoringu/optimalizaci to najde, co to rozbilo (nebo naopak spravilo), ale bohužel chyby to často moc nemá šanci najít.
Jednotkový test nemá nic počítat. Když budu psát jednotkový test na odmocňování, budu testovat, že odmocnina ze dvou vrátí po zaokrouhlení 1,4142 (což si najdu třeba v tabulkách) a odmocnina z -2 vrátí chybu vstupu. Jak se ve skutečnosti odmocnina počítá nemusím pro psaní testu vůbec vědět. Ano, někdy je ten algoritmus tak netypický, že nikde jinde správné výsledky nenajdu, pak opravdu nezbývá, než testem zafixovat výsledky, co ten algoritmus spočítal. Ale to není tak častý případ.

No... taková trapárna jako "null pointer exception". Problém je, že u silného typového systému člověk prostě dělá design tak, aby k té chybě vůbec nemohlo dojít už z principu. U testů je velmi jednoduché zapomenout testovat nějakou funkci na to, zda při nějaké konfiguraci vstupů nespadne na null pointer exception.
„Null pointer exception“ je řekl bych ukázkový příklad. Můžu to ošetřit pomocí typů, pomocí assertů a nebo to můžu testovat. BoneFlute tu asserty řadí do typového systému a dospěl k tomu tak, že začal do typů vkládat přímo testy. Asserty jsou přitom záměrně navržené tak, aby jednoduché případy mohl vyhodnocovat už kompilátor (nebo něco k němu přilepeného). Takže dohadovat se, co přesně je ještě součástí kompilace a co už ne je trochu akademická diskuse, protože to záleží na konkrétní implementaci – právě asserty se obvykle vyhodnocují až za běhu (poprvé tedy typicky v testech), ale stejně tak je může vyhodnocovat už kompilátor.

Takže čistě z praktického hlediska u této konkrétní kategorie chyby bude typický výsledek ten, že typované programy prostě nullpointerexception vyhazovat nebudou, netypované "testované" ano, protože to programátor zapomněl na spoustě míst ošetřit a testy to nenašly.
Myslím, že je to opět spíš teoretický příklad. Z praktického hlediska bude k těm „null pointer exception“ docházet i v těch typových programech, protože ty nefungují ve vzduchoprázdnu, ale komunikují s okolím – a z něj ty NIL hodnoty dostávají. A i tam budou případy, kdy to programátor prostě přetypuje bez kontroly. Krásně je to vidět např. na Kotlinu, který nullable typy zavedl, ale když se někde váže na Javu, je to plné vykřičníků (tj. přetypování nullable typu na non-nullable, ze kterého může vypadnout NullPointerException).

Já to spíš vidím tak, že některé věci prostě není praktické psát do typů (navíc  u některých věcí neexistuje třeba jazyk, který by tyhle věci byl schopen vůbec vyjádřit, u souladu se specifikací to IMO u spousty věcí fakt nejde), někdy by z toho i tak bylo víc práce než užitku.... (na druhou stranu, prakticky kdykoliv jsem nepoužil NonEmpty pro neprázdný list, tak se mi to vymstilo).
Souhlasím. A stejně tak souhlasím s tím, že některé věci je naopak dobré mít v typech – třeba rozlišování typů na nullable/non-nullable považuju za hodně užitečné (i když to počet „null pointer exeception“ jen sníží, ale kromě akademických příkladů je nikdy nevymýtí úplně). Nikdy jsem netvrdil, že silnější typový systém nemůže některé testy učinit zbytečnými. Jenom tvrdím, že sebesilnější typový systém nedokáže nahradit všechny jednotkové testy – protože to, že se algoritmus pro nějaký vstup trefil do správného oboru hodnot ještě neznamená, že je výsledek správně.

Ale konkrétně - jak jsem se inspiroval tím LLVM paperem, tak jsem napsal interpret na ten Mapbox style jazyk a běželo to bez testů napoprvé (po cca. 5 hodinách psaní) a doteď jsem v tom kódu interpretu žádnou chybu nenašel (měl jsem jednu chybu mimo interpret, kdy jsem ve 3 ráno omylem napsal && místo ||). A tady je mimo jiné odpověď na týkající se otázky na "méně kódu" - díky těm typům pak při interpretaci není potřeba kontrolovat, jakého typu jsou vstupy funkcí. Protože prostě mají ten správný typ.
Tohle ale dobře funguje na nízké úrovni, v nějakých knihovnách (kde jsou zároveň nejsilnější i jednotkové testy). Jak se dostáváte výš, deklarativní popis typů by se začal komplikovat a srozumitelnější je použít asserty (i když osobně si myslím, že by programátor měl asserty považovat za deklaraci – ale pořád jsou to výrazy). A na ještě vyšších úrovních už se jenom propojují nějaké komponenty, tam už je řešení pomocí typů úplně nereálné (i kdyby jen proto, že ty komponenty vám dodává někdo jiný, koho nedonutíte detailně nadefinovat typy).

3195
Vývoj / Re:Typový system versus unittesty
« kdy: 26. 06. 2018, 07:29:46 »
Rozumím. Ale chyba může vzniknout i při psaní testu. Vzhledem k tomu, jak často zoufale nečitelné mohou testy být - velmi snadno.
To je ovšem dané špatným způsobem psaní testů. Jednotkové testy mají testovat, zda pro „zajímavé“ vstupy dává kód očekávané výstupy. Není důvod, proč by takový test měl být nečitelný. V testu samozřejmě může být chyba, ale pak se na ní obvykle přijde při spouštění testů, protože test neprojde. Vzhledem k tomu, že je test napsaný úplně jiným způsobem, než testovaný kód, je velmi nepravděpodobné, že by v něm byla stejná algoritmická chyba (zejména když v testu žádný algoritmus nemá být). Samozřejmě je možné, že tam bude systematická chyba – test bude očekávat chybný výstup, protože programátor špatně pochopil zadání. Jenže pokud programátor špatně pochopil zadání, bude chyba v kódu vždy, i když bude mít sebelepší typový systém nebo jakýkoli jiný systém kontroly. Tam je jediná šance, že ten test bude psát někdo jiný, kdo zadání pochopí jinak – ale ani to není stoprocentní cesta k úspěchu, protože problém bývá velmi často v tom zadání, takže je dost pravděpodobné, že ho dva programátoři pochopí stejně špatně. A konečně zřejmě nejčastější důvod, proč test neodhalí chybu, je ten, že nepokrývá všechny zajímavé případy – takže chyba bude jednoduše v něčem, co se netestuje. I tenhle typ chyby se bude objevovat u sebelepšího typového systému, protože když programátora nenapadne, že to je zajímavý případ a měl by na to udělat test, nenapadne ho ani ošetřit to v typovém systému.

Jednou se mi stalo, že jsem našel chybu v kódu, který měl stoprocentní pokrytí testy. Byl to den, kdy jsem na coverage zanevřel.
Vy se neustále míjíte s podstatou problémů. Stoprocentní pokrytí kódu testy znamená, že se při testech projdou všechny „řádky“ (ve skutečnosti instrukce) programu. To samozřejmě v žádném případě neznamená, že jsou otestované všechny případy. Pokrytí kódu testy se používá opačně – když nemáte stoprocentní pokrytí kódu testy, máte takřka jistotu, že nepokrytý kód není otestován žádným způsobem. (Zbývá malá možnost, že nepokrytý kód je nedostupný, pak by ale stejně v kódu neměl být.) Takže pokud jste chybu v kódu, který měl stoprocentní pokrytí testy, našel jenom jednou, zažil jste toho zatím opravdu málo. Že jste na code coverage zanevřel po nalezení jediné chyby svědčí pouze a jen o nedostatku pokory, a to vás pak nezachrání sebelepší nástroje. Proto jsem vám už minule psal, že nemáte hledat stříbrnou kulku, která nějak mechanicky zajistí, že budete psát bezchybné programy (to je nemožné), a radši byste se měl snažit pochopit, k čemu slouží nástroje, které máte k dispozici, a správně je používat. Pak můžete dobrý kód psát i v Javě, v JavaScriptu nebo PHP.

Stran: 1 ... 211 212 [213] 214 215 ... 375