Typový system versus unittesty

BoneFlute

  • *****
  • 2 155
Typový system versus unittesty
« kdy: 17. 06. 2018, 23:39:32 »
Zdravím.

Dospěl jsem k nezdravému přesvědčení, že jednotkové testy nejsou potřeba máte-li kvalitní typový systém.

(Teď samozřejmě neřeším který jazyk a zda něco takového má.)

Zajímalo by mě, můžete zkusit uvést nějaký příklad konstrukce, na kterou je nutné napsat test, protože typem to podchytit nejde?

Díky.


Honza

Re:Typový system versus unittesty
« Odpověď #1 kdy: 18. 06. 2018, 00:16:53 »
Kéž by toto vlákno skončilo konstatováním, že typový systém nemůže nahradit unit testy...

Franta <xkucf03/>

Re:Typový system versus unittesty
« Odpověď #2 kdy: 18. 06. 2018, 00:32:01 »
To je hodně nezdravé přesvědčení :-D Je pravda, že jednotkové testy se často přeceňují, ale tak daleko bych nešel. Spíš bych to formuloval:

jednotkové testy nejsou tolik potřeba máte-li kvalitní typový systém

Metody/funkce ale nemají jen rozhraní (vstup-výstup, definiční obor, obor hodnot), ale (a to hlavně) nějakou logiku uvnitř, nějaký algoritmus. A ten potřebuješ otestovat. Neznám typový systém, který by dokázal deklarativně popsat i tu logiku uvnitř a nahradit testy.

andy

Re:Typový system versus unittesty
« Odpověď #3 kdy: 18. 06. 2018, 01:25:19 »
Ono záleží na tom, jak jsou ty typy definované. Jeden ze způsobů (v Haskellu hodně využívaný) JSON serializace (aeson) jsou instance FromJSON a ToJSON. Mělo by platit

fromJSON . toJSON = Just

Což jinak než jednotkovými testy zkontrolovat nejde (kontroluje se to typicky přes QuickCheck property). Na druhou stranu je pravda, že lze ten typ serializace vyrobit tak, že se popíše způsob té serializace a ta možnost, že by bylo možné vyrobit vzájemně nekompatibilní FromJSON/ToJSON prostě nebude. I tak je ale typicky potřeba nějak otestovat, že alespoň ta knihovna je korektní.

Jednotkové testy prostě typicky píšu pro parsery. Ono se dost blbě typově popisuje, co má ten parser dělat. Pak třeba pro různé výpočty - jestli to počítá fakt správně. Pak třeba pro nějaké multi-threadované problémy (messagebus), jestli to dělá to, co to má dělat.

Citace od: Franta <xkucf03/> kdy 18. 06. 2018, 00:32:01
Metody/funkce ale nemají jen rozhraní (vstup-výstup, definiční obor, obor hodnot), ale (a to hlavně) nějakou logiku uvnitř, nějaký algoritmus. A ten potřebuješ otestovat. Neznám typový systém, který by dokázal deklarativně popsat i tu logiku uvnitř a nahradit testy.
No... dependent types dokážou hodně. https://www.youtube.com/watch?v=n-b1PYbRUOY - ukázka implementace red-black tree. Ono je to v podstatě takový model checker.... Ono se v typových systémech dá popsat docela hodně, ale je to někdy takové práce, že je rychlejší napsat si ty unit testy (nebo ještě líp quickcheck property testy)

BoneFlute

  • *****
  • 2 155
Re:Typový system versus unittesty
« Odpověď #4 kdy: 18. 06. 2018, 01:30:39 »
Citace od: andy kdy 18. 06. 2018, 01:25:19
Ono záleží na tom, jak jsou ty typy definované. Jeden ze způsobů (v Haskellu hodně využívaný) JSON serializace (aeson) jsou instance FromJSON a ToJSON. Mělo by platit

fromJSON . toJSON = Just

Což jinak než jednotkovými testy zkontrolovat nejde (kontroluje se to typicky přes QuickCheck property). Na druhou stranu je pravda, že lze ten typ serializace vyrobit tak, že se popíše způsob té serializace a ta možnost, že by bylo možné vyrobit vzájemně nekompatibilní FromJSON/ToJSON prostě nebude. I tak je ale typicky potřeba nějak otestovat, že alespoň ta knihovna je korektní.

Jednotkové testy prostě typicky píšu pro parsery. Ono se dost blbě typově popisuje, co má ten parser dělat. Pak třeba pro různé výpočty - jestli to počítá fakt správně. Pak třeba pro nějaké multi-threadované problémy (messagebus), jestli to dělá to, co to má dělat.
Tento příklad mi zrovna přijde celkem na pohodu. Nadefinuju si jednotlivé elementy jsonu, serialize to string. Že to dává smysl zkouknu okem, a pak zafixuju ala Elm.


BoneFlute

  • *****
  • 2 155
Re:Typový system versus unittesty
« Odpověď #5 kdy: 18. 06. 2018, 01:37:12 »
Citace od: Franta <xkucf03/> kdy 18. 06. 2018, 00:32:01
jednotkové testy nejsou tolik potřeba máte-li kvalitní typový systém

Prosím, toto není námětem mé otázky.

Gődel

Re:Typový system versus unittesty
« Odpověď #6 kdy: 18. 06. 2018, 01:40:27 »
Citace od: BoneFlute kdy 17. 06. 2018, 23:39:32
jednotkové testy nejsou potřeba máte-li kvalitní typový systém.
Jednotkové testy a typový systém řeší ortogonální problémy. Je ale pravda, že závislostní typy jsou nesmírně mocný nástroj a odchytí neuvěřitelné množství chyb. I tak je ale vhodné použít unit testy pro otestování logiky kódu (to typově dost dobře nejde).

BoneFlute

  • *****
  • 2 155
Re:Typový system versus unittesty
« Odpověď #7 kdy: 18. 06. 2018, 01:51:37 »
Citace od: Gődel kdy 18. 06. 2018, 01:40:27
I tak je ale vhodné použít unit testy pro otestování logiky kódu (to typově dost dobře nejde).
Proč?

tdvorak

Re:Typový system versus unittesty
« Odpověď #8 kdy: 18. 06. 2018, 06:38:21 »
Citace od: BoneFlute kdy 18. 06. 2018, 01:51:37
Citace od: Gődel kdy 18. 06. 2018, 01:40:27
I tak je ale vhodné použít unit testy pro otestování logiky kódu (to typově dost dobře nejde).
Proč?
Jak typy zajistis, ze tvoje metoda sum(a,b) vraci pro int a a int b spravny int soucet? Jako alternativu k primitivnimu assertEquals(3, sum(1,2)) ?

Re:Typový system versus unittesty
« Odpověď #9 kdy: 18. 06. 2018, 07:18:00 »
Citace od: Honza kdy 18. 06. 2018, 00:16:53
Kéž by toto vlákno skončilo konstatováním, že typový systém nemůže nahradit unit testy...
...a naopak.

uuuuuuuu

Re:Typový system versus unittesty
« Odpověď #10 kdy: 18. 06. 2018, 07:22:03 »
Citace od: Ondra Satai Nekola kdy 18. 06. 2018, 07:18:00
Citace od: Honza kdy 18. 06. 2018, 00:16:53
Kéž by toto vlákno skončilo konstatováním, že typový systém nemůže nahradit unit testy...
...a naopak.


A naopak:  kez by to vlakno zacalo konstatovanim.....

Kit

Re:Typový system versus unittesty
« Odpověď #11 kdy: 18. 06. 2018, 09:12:49 »
Citace od: Ondra Satai Nekola kdy 18. 06. 2018, 07:18:00
Citace od: Honza kdy 18. 06. 2018, 00:16:53
Kéž by toto vlákno skončilo konstatováním, že typový systém nemůže nahradit unit testy...
...a naopak.

Prosil bych ukázku použití typového systému, ve které není možné provést náhradu jednotkovými testy.

Re:Typový system versus unittesty
« Odpověď #12 kdy: 18. 06. 2018, 09:38:55 »
Citace od: Kit kdy 18. 06. 2018, 09:12:49
Prosil bych ukázku použití typového systému, ve které není možné provést náhradu jednotkovými testy.
Jedna věc je, zda je to teoreticky možné, druhá věc je, zda opravdu ručně psanými jednotkovými testy pokryjete všechny možnosti.

A snad ještě podstatnější je to, že typový systém používá programátor přímo při psaní (jako dokumentaci) – což je úplně něco jiného, než když bude zkoušet náhodně psát kód a zkoušet, jestli to projde jednotkovými testy.

Re:Typový system versus unittesty
« Odpověď #13 kdy: 18. 06. 2018, 10:16:31 »
Citace od: BoneFlute kdy 17. 06. 2018, 23:39:32
Zdravím.

Dospěl jsem k nezdravému přesvědčení, že jednotkové testy nejsou potřeba máte-li kvalitní typový systém.

(Teď samozřejmě neřeším který jazyk a zda něco takového má.)

Zajímalo by mě, můžete zkusit uvést nějaký příklad konstrukce, na kterou je nutné napsat test, protože typem to podchytit nejde?

Díky.

Je to kacir. Upalte ho!

A ted vazne. Budeme povazovat napriklad clojure.spec za soucast typoveho systemu, nebo nastroj pro testovani?
A co generativni property based testing (napr. QuickCheck)? Je definice vlastnosti funkce typova zalezitost nebo testovaci?

Btw. diky za to otazku. Samotneho by me ani nenapadlo o tom premyslet a ted mam pocit ze jsem dosahl dilciho osviceni.

andy

Re:Typový system versus unittesty
« Odpověď #14 kdy: 18. 06. 2018, 10:23:01 »
CitaceTento příklad mi zrovna přijde celkem na pohodu. Nadefinuju si jednotlivé elementy jsonu, serialize to string. Že to dává smysl zkouknu okem, a pak zafixuju ala Elm.
Tomu asi nerozumím - je poměrně jednoduché vytvořit ToJSON a FromJSON tak, aby to navzájem kompatibilní nebylo. Tak, jak jsou ty typeclassy oddělené, nejde typově zajistit, že to kompatibilní je. Je možné vyrobit ty typy jinak. Nicméně parsing obecně typově kontrolovat nejde - ten soulad se specifikací prostě do typu té funkce Text -> ParsedValue nenakóduju.

Citace od: tdvorak kdy 18. 06. 2018, 06:38:21
Jak typy zajistis, ze tvoje metoda sum(a,b) vraci pro int a a int b spravny int soucet? Jako alternativu k primitivnimu assertEquals(3, sum(1,2)) ?
No já bych řekl, že to pude ;) (nejsem teda vůbec expert na dependent types), ale Nat (natural number) jako typ existuje, udělat součet v peanově algebře (fakt nevim o čem mluvim) jde taky a dopsat k tomu ty důkazy do těl funkcí je poměrně primitivní záležitost. Ale pravda, je to trošku cvičení o ničem...

CitaceA co generativni property based testing (napr. QuickCheck)? Je definice vlastnosti funkce typova zalezitost nebo testovaci?
IMO testovací.