Typový system versus unittesty

SB

Re:Typový system versus unittesty
« Odpověď #135 kdy: 19. 06. 2018, 13:19:39 »
...V unittestech otestuju pár jednoduchých případů a mám celkem jistotu.

Jistotu nemáte, ale i jednoduchým(!) testem můžete zachytit ty největší průsery či totální nefunkčnosti (pravděpodobnost, že chybějící implementace či metoda vám vrátí správný výsledek, je nula hovno), v případě pouhých několika specifických testů dokážete dosáhnout řádově větší protestovanosti než POUHOU typovou kontrolou (kterou můžete úplně klidně též do testu u netypového jazyku doplnit!).

Mimochodem v TDD je pravidlem, že se píší vybrakované metody, které se teprve na stížnost hotových testů vyplňují, případně (a teď pozor, soudruzi javaři nečtěte dále, aby vám z toho nehráblo) se tyto metody teprve vytvářejí! :O :O :O (No nekecej!)

Tohle není odpověď pro JSH, ale autora dotazu Boneflute.


v

Re:Typový system versus unittesty
« Odpověď #136 kdy: 19. 06. 2018, 13:22:15 »
Tak jinak: Doplňuju svůj původní příspěvek:

místo <cokoliv> je "return 10"

Typově je vše správně, ale nějak nám to pro většinu vstupů nevychází, přičemž by to mělo vyjít alespoň pro ty, které budu používat.

Přeloženo: Typová kontrola by zafungovala pouze v případě, že pro každé dva sčítance a součet budete mít extra typy, což je ale v rozporu s jednoduchými, obecnými kategoriemi (zde celá čísla) a prakticky to neřeší problém.
s použitím techniky o které jsem mluvil by se takový kód nepřeložil, že má třeba 1 a 2 jiný datový typ není nic až tak zvláštního

Re:Typový system versus unittesty
« Odpověď #137 kdy: 19. 06. 2018, 13:25:01 »
používá to peanovu aritmetiku na typové úrovni pro vynucení vlastností operací s vektorama (ve smyslu datové struktury), např. tahle funkce je vlastně to stejné jako sčítání:
append :: Vector a n -> Vector a m -> Vector a (n :+ m)
délka výsledného vektoru je součet délek vstupních vektorů (a typový systém to opravdu na implementaci vynutí)
Stále se míjíte s podstatou problému. V mém příkladu bylo záměrně sčítání a odčítání. Abyste si uvědomil, že v běžném programu budu potřebovat obojí, a žádný typový systém neohlídá to, že nepoužiju odčítání tam, kde z logiky věci má být sčítání.

v

Re:Typový system versus unittesty
« Odpověď #138 kdy: 19. 06. 2018, 13:25:20 »
používá to peanovu aritmetiku na typové úrovni pro vynucení vlastností operací s vektorama (ve smyslu datové struktury), např. tahle funkce je vlastně to stejné jako sčítání:
append :: Vector a n -> Vector a m -> Vector a (n :+ m)
délka výsledného vektoru je součet délek vstupních vektorů (a typový systém to opravdu na implementaci vynutí)
1) Ten typ ale vůbec nezaručuje, že ten append dělá to, co chceme. Ten typ je kompatibilní se spoustou věcí od appendu v libovolném pořadí až po nějaké pseudonáhodné promíchání.
2) V reálných programech se obvykle počet prvků dovídám až v runtimu.
3) A jak to vůbec souvisí s tím, jestli kód odpovídá řešenému problému?
1) to je pravda a nevím jak to řešit, pro sčítání to ovšem nehraje roli
2) to se dá řešit
3) typ specifikuje co je řešený problém, funkce tomu musí odpovídat

v

Re:Typový system versus unittesty
« Odpověď #139 kdy: 19. 06. 2018, 13:27:29 »
používá to peanovu aritmetiku na typové úrovni pro vynucení vlastností operací s vektorama (ve smyslu datové struktury), např. tahle funkce je vlastně to stejné jako sčítání:
append :: Vector a n -> Vector a m -> Vector a (n :+ m)
délka výsledného vektoru je součet délek vstupních vektorů (a typový systém to opravdu na implementaci vynutí)
Stále se míjíte s podstatou problému. V mém příkladu bylo záměrně sčítání a odčítání. Abyste si uvědomil, že v běžném programu budu potřebovat obojí, a žádný typový systém neohlídá to, že nepoužiju odčítání tam, kde z logiky věci má být sčítání.
tak když někdo špatně pochopí problém, tak mu taky nic nezabrání napsat chybný test


Re:Typový system versus unittesty
« Odpověď #140 kdy: 19. 06. 2018, 13:27:46 »
s použitím techniky o které jsem mluvil by se takový kód nepřeložil, že má třeba 1 a 2 jiný datový typ není nic až tak zvláštního
Jak zabráníte tomu, aby programátor nepoužil špatný typ? Místo typu pro „sčítání“ použije typ pro „odčítání“.

JSH

Re:Typový system versus unittesty
« Odpověď #141 kdy: 19. 06. 2018, 13:28:29 »
s použitím techniky o které jsem mluvil by se takový kód nepřeložil, že má třeba 1 a 2 jiný datový typ není nic až tak zvláštního
A k čemu to je, když většina numerických hodnot, se kterýma se pracuje, je k dispozici až v runtime? Na zkontrolování čísel, která znám při kompilaci, obvykle stačí blbý static_assert či něco podobného.

Re:Typový system versus unittesty
« Odpověď #142 kdy: 19. 06. 2018, 13:32:45 »
tak když někdo špatně pochopí problém, tak mu taky nic nezabrání napsat chybný test
To je ale nepochopení testů. Testy nemají opakovat implementaci, testy mají kontrolovat, zda pro zadaný vstup dostanu očekávaný výstup.

Nikdo netvrdil, že testy jsou dokonalé a že nemůže být chyba i v testu. Pouze vyvracíme tvrzení, že jednotkové testy lze plně nahradit silným typovým systémem. Vyvráceno to bylo triviálním příkladem, kdy programátor použije odčítání místo sčítání, a tomu žádný typový systém z logiky věci nemůže zabránit.

Harik

Re:Typový system versus unittesty
« Odpověď #143 kdy: 19. 06. 2018, 13:32:50 »
Sorry, tvé příspěvky nejsou vůbec inspirativní. Nebudu se tedy tebou již zabejvat.

Jirsák a nobody  ;D ;D

v

Re:Typový system versus unittesty
« Odpověď #144 kdy: 19. 06. 2018, 13:34:33 »
s použitím techniky o které jsem mluvil by se takový kód nepřeložil, že má třeba 1 a 2 jiný datový typ není nic až tak zvláštního
A k čemu to je, když většina numerických hodnot, se kterýma se pracuje, je k dispozici až v runtime? Na zkontrolování čísel, která znám při kompilaci, obvykle stačí blbý static_assert či něco podobného.
nekontrolují se konkrétní čísla (typicky), ale funkce, které s nimi pracují, např. ten příklad se sčítáním tvrdí, že předpoklad z typu je splněn pro všechna čísla (Nat)

v

Re:Typový system versus unittesty
« Odpověď #145 kdy: 19. 06. 2018, 13:38:29 »
tak když někdo špatně pochopí problém, tak mu taky nic nezabrání napsat chybný test
To je ale nepochopení testů. Testy nemají opakovat implementaci, testy mají kontrolovat, zda pro zadaný vstup dostanu očekávaný výstup.

Nikdo netvrdil, že testy jsou dokonalé a že nemůže být chyba i v testu. Pouze vyvracíme tvrzení, že jednotkové testy lze plně nahradit silným typovým systémem. Vyvráceno to bylo triviálním příkladem, kdy programátor použije odčítání místo sčítání, a tomu žádný typový systém z logiky věci nemůže zabránit.
já jsem ale o opakování implementace nic nepsal, pokud špatně pochopíte problém, můžete napsat test, který od funkce chce pro zadané vstupy jiné výstupy, než ty správné (z hlediska řešeného problému)
a prosím přestaňte si domýšlet obsah příspěvků, pokud máte pochybnosti tak se prostě zeptejte

SB

Re:Typový system versus unittesty
« Odpověď #146 kdy: 19. 06. 2018, 13:49:17 »
tak když někdo špatně pochopí problém, tak mu taky nic nezabrání napsat chybný test

To už ale nemá co dělat s problematikou testování, ale chápání řešené úlohy, zde nevznikne rozdíl při použití typového systému, nebo testů.

v

Re:Typový system versus unittesty
« Odpověď #147 kdy: 19. 06. 2018, 13:52:24 »
tak když někdo špatně pochopí problém, tak mu taky nic nezabrání napsat chybný test

To už ale nemá co dělat s problematikou testování, ale chápání řešené úlohy, zde nevznikne rozdíl při použití typového systému, nebo testů.
souhlasím

Kit

Re:Typový system versus unittesty
« Odpověď #148 kdy: 19. 06. 2018, 14:04:37 »
...V unittestech otestuju pár jednoduchých případů a mám celkem jistotu.

Jistotu nemáte, ale i jednoduchým(!) testem můžete zachytit ty největší průsery či totální nefunkčnosti (pravděpodobnost, že chybějící implementace či metoda vám vrátí správný výsledek, je nula hovno), v případě pouhých několika specifických testů dokážete dosáhnout řádově větší protestovanosti než POUHOU typovou kontrolou (kterou můžete úplně klidně též do testu u netypového jazyku doplnit!).

Ty testy se nepíší náhodně, ale testují se hlavně okrajové podmínky, kdy testovaná jednotka může selhat nebo musí selhat.

Mimochodem v TDD je pravidlem, že se píší vybrakované metody, které se teprve na stížnost hotových testů vyplňují, případně (a teď pozor, soudruzi javaři nečtěte dále, aby vám z toho nehráblo) se tyto metody teprve vytvářejí! :O :O :O (No nekecej!)

Má to svůj důvod. Pokud vytvořím test, který neselže, je to problém, který se musí vyřešit dříve, než napíši první znak testované jednotky. Může to být způsobeno například kolizí názvů, takže ten test testuje jinou jednotku téhož jména, která náhodou také projde.

Pak teprve napíši ty prázdné metody, které musí splnit definované rozhraní. Až testy projdou, teprve je čas na rozšíření testů o požadované funkcionality a následně i rozšíření metod.

Kit

Re:Typový system versus unittesty
« Odpověď #149 kdy: 19. 06. 2018, 14:08:27 »
Stále se míjíte s podstatou problému. V mém příkladu bylo záměrně sčítání a odčítání. Abyste si uvědomil, že v běžném programu budu potřebovat obojí, a žádný typový systém neohlídá to, že nepoužiju odčítání tam, kde z logiky věci má být sčítání.
tak když někdo špatně pochopí problém, tak mu taky nic nezabrání napsat chybný test

Jistě, ale vcelku brzy zjistí, že ten test je chybný. Testy na testy se však nepíší, od toho tu jsou testované jednotky.