Typový system versus unittesty

Re:Typový system versus unittesty
« Odpověď #480 kdy: 26. 06. 2018, 21:52:40 »
Nicmene tvuj priklad krasne ukazuje, ze pri pouziti vhodnych typu ztraci smysl vsechny negativni testy.
Což je ovšem dost slabé tvrzení oproti původnímu „nejsou potřeba žádné testy“.
Ja ani tak nerikam, nejsou potreba, ale spis nejdou napsat. Je to uplne odlisny vyrok. Nedaval bych to do souvislosti.

Za prvé je z toho hned vidět, že definovat funkce výčtem hodnot je pro reálné programy v drtivé většině případů nepoužitelné. Až začnete psát o tom, že se to přece dá nějak redukovat a nevypisovat všechny hodnoty, ale nahradit to nějakým předpisem – pak právě přijdou na řadu ty testy, které porovnávají, jestli ten předpis pro některé zajímavé hodnoty dává opravdu tu hodnotu, která by měla být v tom výčtu.
A ja myslel, ze sem se vyjadril fakt pochopitelne. Asi ne.

Za druhé, pokud by vám nemožnost udělat úplný výčet připadala jako nějaké dočasné technické omezení, vzpomeňte si třeba na funkce rand() nebo na faktorizaci velkých čísel – kdybychom dokázali ty funkce definovat výčtem hodnot, přestaly by být zajímavé a nikdo by je nepoužíval.
Mohl bych videt prosim nejaky unit test na "funkci" rand?


Za třetí, pořád předpokládáte, že výkonný kód i test vzniká stejným způsobem a píše to ten samý programátor. Ve skutečnosti kdyby vám někdo dal funkci (i se zdrojákem) definovanou výčtem hodnot a tvrdil by vám, že ta funkce dělá X, první co byste udělal, že byste si v tom zdrojáku vyhledal pár hodnot a ověřil byste, že alespoň pro tyhle hodnoty opravdu dělá X.

Urcite ne.


BoneFlute

  • *****
  • 1 841
    • Zobrazit profil
Re:Typový system versus unittesty
« Odpověď #481 kdy: 26. 06. 2018, 22:57:53 »
Pokryti testy asi vetsina lidi chape jako (mnozstvi kodu spusteneho behem testovani)/(celkove mnozstvi kodu) a ne jako (mnozstvi testovanych vstupu)/(mnozstvi vsech moznych vstupu).
To, že otestuju tři hodnoty, a prohlásím, že kód je otestovaný, přičemž u čtvrté hodnoty to chcípne, to je poněkud smutné, nemyslíš?

Nicmene tvuj priklad krasne ukazuje, ze pri pouziti vhodnych typu ztraci smysl vsechny negativni testy. A nejen smysl, ale vlastne ani nejdou napsat/spustit, protoze ta typovane verze funkce proste nejde zavolat s jinym typem argumentu.
Tak :-)

Funkce se da vyjadrit:
  • analyticky - o to se vetsina programatoru snazi
  • graficky - o to se vetsina programatoru nesnazi, ale mohlo by to byt zajimave
  • vyctem hodnot - o to se vlastne snazi BoneFlute, akorat se mu nechce psat vsechny tak "zneuziva" typovy system
Asi bych se nespokojil s tím, že chápu funkci jen jako výčet hodnot, ale uznávám, že většina mejch ukázek je o tom.

Ale to grafické vyjádření funkce by mě zajímalo. Můžeš to prosím rozvést?

Re:Typový system versus unittesty
« Odpověď #482 kdy: 26. 06. 2018, 23:43:36 »
požadovaná?? tak tohle je asi moje mez, jestli neukážete aspoň trochu snahy porozumět tématu, tak na vás asi nebudu reagovat
Myslím, že tématu rozumím docela dobře. Téma je, že vy jste moderní borec a každý, kdo zpochybní vaše tvrzení, je zpátečník. A jakmile máte ukázat něco konkrétního, začnete se kroutit a vymlouvat, že tomu nikdo nerozumí. Přitom se po vás chce tak banální věc, abyste podle jednoduchého zadání napsal kód, u kterého nebude dávat žádný smysl něco testovat. Bez toho zadání se to samozřejmě neobejde, protože se testuje soulad se zadáním – kód bez zadání opravdu nemá smysl testovat.

Re:Typový system versus unittesty
« Odpověď #483 kdy: 26. 06. 2018, 23:45:53 »
můžete uvést nějaký příklad menšího většího projektu? třeba ten typově bezpečný AST jsem úspěšně aplikoval na reálný programovací jazyk (IEC61131 STL), je to učebnicový příklad?
Co třeba taková kalkulačka? Jenom simulace té nejobyčejnější kalkulačky – zadávání čísel v desítkové soustavě, sčítání, odčítání, násobení a dělení. Žádné priority, žádné paměti, žádné další funkce. Můžete napsat, jaké byste tam použil typy, jak by vypadal kód – a zda byste tam měl nějaké testy, případně jaké?

https://gist.github.com/ondrap/69fa2162bc2516469642e5380b379f5c (v reálu by tam byl zvlášť typ na operátor a Show instance pro jednodušší debugování, která se bohužel u toho ExprF nenageneruje sama)

Testy obvykle dělám na parsing, a pak asi nějaký test, že to nepočítá úplnou haluz (i.e. 100% code coverage, tady že jsem se neuklep v těch operátorech). Ono tam teda moc co testovat není....  jinak parser na "normální" výrazy není o moc delší, jen jsem línej to hledat... tam by se asi pak řešilo v testech, jestli se korektně respektuje priorita operátorů.

No, ale v podstatě je to to, co jsem psal - parsing typově moc obsáhnout nejde, vlastní výpočet má v podstatě 3 řádky a  není moc co tam splést.... aritmetika na Double je poměrně "totální", takže tam taky není moc co řešit...

Na tomhle se shodneme. Tak třeba to teď konečně vezme v nebo BoneFlute a upraví ten kód tak, aby byly zbytečné všechny testy.

BoneFlute

  • *****
  • 1 841
    • Zobrazit profil
Re:Typový system versus unittesty
« Odpověď #484 kdy: 26. 06. 2018, 23:52:17 »
https://gist.github.com/ondrap/69fa2162bc2516469642e5380b379f5c (v reálu by tam byl zvlášť typ na operátor a Show instance pro jednodušší debugování, která se bohužel u toho ExprF nenageneruje sama)

Testy obvykle dělám na parsing, a pak asi nějaký test, že to nepočítá úplnou haluz (i.e. 100% code coverage, tady že jsem se neuklep v těch operátorech). Ono tam teda moc co testovat není....  jinak parser na "normální" výrazy není o moc delší, jen jsem línej to hledat... tam by se asi pak řešilo v testech, jestli se korektně respektuje priorita operátorů.

No, ale v podstatě je to to, co jsem psal - parsing typově moc obsáhnout nejde, vlastní výpočet má v podstatě 3 řádky a  není moc co tam splést.... aritmetika na Double je poměrně "totální", takže tam taky není moc co řešit...

Moc pěkný. Díky!


Re:Typový system versus unittesty
« Odpověď #485 kdy: 27. 06. 2018, 00:01:41 »
Ja ani tak nerikam, nejsou potreba, ale spis nejdou napsat. Je to uplne odlisny vyrok. Nedaval bych to do souvislosti.
Ovšem celou dobu se tu řeší, zda je pravdivé tvrzení, že testy (v případě dobrého typového systému) vůbec nejsou potřeba. To tvrzení je samozřejmě možné dokázat i metodou, že vyjmenujete různé skupiny testů, u nich ukážete, že jsou zbytečné (nebo že ani nejdou zkompilovat), a pak ukážete, že jste takhle „vyřídil“ všechny skupiny testů. Ale nemá smysl dokazovat jenom tvrzení, že některé testy nebudou potřeba (nebo nepůjdou zkompilovat), protože to tady nikdo nerozporoval.

A ja myslel, ze sem se vyjadril fakt pochopitelne. Asi ne.
Jestli jste to myslel jako reálné řešení problému, pak vás zklamu, ale paměť dnešních počítačů je na tohle stále malá, takže úplným výčtem byste mohl řešit jen velmi jednoduché problémy. Ale zase je ta paměť dost velká na to, aby vás popis toho problému úplným výčtem možností přestal bavit mnohem dřív, než ta paměť dojde.

Mohl bych videt prosim nejaky unit test na "funkci" rand?
Zrovna testování náhodnosti není nic snadného, ale u důležitých systémů (třeba generátory pro kryptografii) se to samozřejmě dělá. Nejjednodušší test by mohl získat třeba 1000 náhodných hodnot, normalizovat je do rozsahu <0, 1) a otestovat, že se průměrná hodnota neliší od 0,5 o víc než nějaké delta. Rozumnější test by kontroloval i distribuci hodnot.

Urcite ne.
Takže věříte tomu, co je napsané v dokumentaci? A pokud něco není v dokumentaci jasně popsané, tak tu službu vůbec nepoužíváte? Nebo si všechno píšete sám, od jádra operačního systému?

Kiwi

Re:Typový system versus unittesty
« Odpověď #486 kdy: 27. 06. 2018, 00:43:41 »
trochu offtopic, ale nemáte někdo nějakou teorii tohohle vehementního odmítání moderních technologií?
Co se týče mě, tak neodmítám, jen jsem si z toho nesedl na zadek, protože to žádná zázračná stříbrná kulka není. Nejspíš na to časem taky přijdeš, obvykle se tak děje když se člověk dostane od učebnicových příkladů k většímu projektu.
můžete uvést nějaký příklad menšího většího projektu? třeba ten typově bezpečný AST jsem úspěšně aplikoval na reálný programovací jazyk (IEC61131 STL), je to učebnicový příklad?
No a závěr je teda jaký? Že bych si z toho měl sednout na zadek, protože... co?

v

Re:Typový system versus unittesty
« Odpověď #487 kdy: 27. 06. 2018, 08:44:10 »
trochu offtopic, ale nemáte někdo nějakou teorii tohohle vehementního odmítání moderních technologií?
Co se týče mě, tak neodmítám, jen jsem si z toho nesedl na zadek, protože to žádná zázračná stříbrná kulka není. Nejspíš na to časem taky přijdeš, obvykle se tak děje když se člověk dostane od učebnicových příkladů k většímu projektu.
můžete uvést nějaký příklad menšího většího projektu? třeba ten typově bezpečný AST jsem úspěšně aplikoval na reálný programovací jazyk (IEC61131 STL), je to učebnicový příklad?
No a závěr je teda jaký? Že bych si z toho měl sednout na zadek, protože... co?
dílčí závěr je, že sezení na zadku apod. není předmětem této diskuze (BoneFlute mě kdyžtak opraví), více možná až odpovíte na položené dotazy

v

Re:Typový system versus unittesty
« Odpověď #488 kdy: 27. 06. 2018, 08:44:59 »
Na tomhle se shodneme. Tak třeba to teď konečně vezme v nebo BoneFlute a upraví ten kód tak, aby byly zbytečné všechny testy.
[/quote]
proč by to vůbec někdo dělal?

Re:Typový system versus unittesty
« Odpověď #489 kdy: 27. 06. 2018, 10:01:47 »
proč by to vůbec někdo dělal?
Například proto, aby dokázal pravdivost tvrzení, kterým celé tohle téma odstartovalo – a jehož pravdivost tady mnoho lidí zpochybnilo. BoneFlute na jeho pravdivosti stále trvá (zatím bez důkazu), tak by bylo hezké mít alespoň jeden příklad, kdy to platí.

Re:Typový system versus unittesty
« Odpověď #490 kdy: 27. 06. 2018, 10:11:25 »
Pokryti testy asi vetsina lidi chape jako (mnozstvi kodu spusteneho behem testovani)/(celkove mnozstvi kodu) a ne jako (mnozstvi testovanych vstupu)/(mnozstvi vsech moznych vstupu).
To, že otestuju tři hodnoty, a prohlásím, že kód je otestovaný, přičemž u čtvrté hodnoty to chcípne, to je poněkud smutné, nemyslíš?
Ale jo, ale to pokryti zajima spis management nez programatory. Je to nejaka metrika ktere si mysli, ze rozumi. Ja na svem projektu rozhodne zadne pokryti nemerim.

Funkce se da vyjadrit:
  • analyticky - o to se vetsina programatoru snazi
  • graficky - o to se vetsina programatoru nesnazi, ale mohlo by to byt zajimave
  • vyctem hodnot - o to se vlastne snazi BoneFlute, akorat se mu nechce psat vsechny tak "zneuziva" typovy system
Asi bych se nespokojil s tím, že chápu funkci jen jako výčet hodnot, ale uznávám, že většina mejch ukázek je o tom.

Ale to grafické vyjádření funkce by mě zajímalo. Můžeš to prosím rozvést?
Nemuzu. Nerozumim tomu :-). Vychazel jsem jen z toho, ze v matematice lze funkci vyjadrit tremi zpusoby. Dva z nich jsou pouzitelne i v programovani, tak proc ne ten treti?
Jedine co si dovedu predstavit je nejake vzorkovani, ktere problem redukuje na vycet hodnot, takze vlastne nuda.

v

Re:Typový system versus unittesty
« Odpověď #491 kdy: 27. 06. 2018, 10:31:36 »
proč by to vůbec někdo dělal?
Například proto, aby dokázal pravdivost tvrzení, kterým celé tohle téma odstartovalo – a jehož pravdivost tady mnoho lidí zpochybnilo. BoneFlute na jeho pravdivosti stále trvá (zatím bez důkazu), tak by bylo hezké mít alespoň jeden příklad, kdy to platí.
zase to překrucujete, BoneFlute se ptal na příklad kdy to nejde

Re:Typový system versus unittesty
« Odpověď #492 kdy: 27. 06. 2018, 10:33:30 »
To, že otestuju tři hodnoty, a prohlásím, že kód je otestovaný, přičemž u čtvrté hodnoty to chcípne, to je poněkud smutné, nemyslíš?
Ano, je to smutné, že programují i lidé, kterým to moc nejde, a běžně nedokážou určit ani ty potenciálně problematické vstupní hodnoty. Že na to nenapíší test je ten menší problém – horší je, že když o tom problému nevědí, neošetří ho ani v tom výkonném kódu.

Re:Typový system versus unittesty
« Odpověď #493 kdy: 27. 06. 2018, 10:37:58 »
zase to překrucujete, BoneFlute se ptal na příklad kdy to nejde
Ano, a jeden takový příklad, kdy to nejde, tu právě máme. Pokud někdo tvrdí, že to jde vždy, očekával bych, že ten příklad nějak zpochybní, třeba že u jednotlivých testů dokáže, že jsou zbytečné.

v

Re:Typový system versus unittesty
« Odpověď #494 kdy: 27. 06. 2018, 10:54:10 »
zase to překrucujete, BoneFlute se ptal na příklad kdy to nejde
Ano, a jeden takový příklad, kdy to nejde, tu právě máme. Pokud někdo tvrdí, že to jde vždy, očekával bych, že ten příklad nějak zpochybní, třeba že u jednotlivých testů dokáže, že jsou zbytečné.
který příklad? v jakém systému a proč to nejde? vy furt opakujete, že to nejde, ale zatím váš jedinný argument byl, že to nejde