Typový system versus unittesty

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Typový system versus unittesty
« Odpověď #45 kdy: 18. 06. 2018, 13:31:20 »
Tak ono jaksi uz v principu typy resi (ne nutne dost zevrubnou) kontrolu pro vsechny mozne hodnoty, zatimco testy jenom pro nejake konkretni (at uz zadane nebo v pripade property based testu generovane) hodnoty.

ta kontrola může být dost komplikovaná. Samotnou definici typu potom musíte testovat na nějakých konkrétních hodnotách. Napadá mě třeba typ reprezentující číslo kreditní karty. Je docela jedno, jestli je validace součástí typu nebo v samostatné funkci.

Co na té kartě chceš testovat?

https://en.wikipedia.org/wiki/Luhn_algorithm


BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Typový system versus unittesty
« Odpověď #46 kdy: 18. 06. 2018, 13:36:00 »
Tak ono jaksi uz v principu typy resi (ne nutne dost zevrubnou) kontrolu pro vsechny mozne hodnoty, zatimco testy jenom pro nejake konkretni (at uz zadane nebo v pripade property based testu generovane) hodnoty.

ta kontrola může být dost komplikovaná. Samotnou definici typu potom musíte testovat na nějakých konkrétních hodnotách. Napadá mě třeba typ reprezentující číslo kreditní karty. Je docela jedno, jestli je validace součástí typu nebo v samostatné funkci.

Co na té kartě chceš testovat?

https://en.wikipedia.org/wiki/Luhn_algorithm

Díky. V tomto případě mi stále ještě fantazie neselhává. Ale díky.

Re:Typový system versus unittesty
« Odpověď #47 kdy: 18. 06. 2018, 13:48:39 »
A následně bylo poukázáno, že toto by šlo: https://forum.root.cz/index.php?topic=18804.msg270160#msg270160
Nikoli, bylo poukázáno, že by šlo něco jiného. Sčítání i odčítání dvou čísel jsou legitimní operace a záleží na použití, kdy použiju tu a kdy onu.

Ale pokud si myslíte, že je to řešitelné typovým systémem, ukažte váš kód. Ukažte, jak byste navrhl typový systém, který by u následujícího kódu odhalil chybu.

Kód: [Vybrat]
int add(int x, int y) {
  return x - y;
}

int sub(int x, int y) {
  return x - y;
}

Mně připadá, že je triviálně vidět, že ta funkce add() je špatně pojmenovaná (a případně má špatnou dokumentaci), což nevyřeší žádný typový systém. Ale budu rád, když mne vyvedete z omylu.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Typový system versus unittesty
« Odpověď #48 kdy: 18. 06. 2018, 13:59:19 »
Mně připadá, že je triviálně vidět, že ta funkce add() je špatně pojmenovaná (a případně má špatnou dokumentaci), což nevyřeší žádný typový systém. Ale budu rád, když mne vyvedete z omylu.

Ukaž mi unittest s témže.

Bavíme se (doufám) o tvrzení, že typy plně nahradí unittesty. Nic víc neřeším.

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Typový system versus unittesty
« Odpověď #49 kdy: 18. 06. 2018, 14:05:43 »
Mně připadá, že je triviálně vidět, že ta funkce add() je špatně pojmenovaná (a případně má špatnou dokumentaci), což nevyřeší žádný typový systém. Ale budu rád, když mne vyvedete z omylu.

Ukaž mi unittest s témže.

Bavíme se (doufám) o tvrzení, že typy plně nahradí unittesty. Nic víc neřeším.

Kód: [Vybrat]
def add(x: int, y: int) -> int:
    """
    >>> add(1, 1)
    2
    """
    return x - y


Re:Typový system versus unittesty
« Odpověď #50 kdy: 18. 06. 2018, 14:07:10 »
Bavíme se (doufám) o tvrzení, že typy plně nahradí unittesty. Nic víc neřeším.
Bavíme se o vašem tvrzení, že by unittesty byly plně nahrazeny typy.

Ukaž mi unittest s témže.
To opravdu takovou trivialitu neodkážete napsat sám? Tu chybu odhalí už takhle primitivní test, který nezkoumá žádné mezní stavy, ale prostě jen otestuje jeden jednoduchý nezajímavý případ.

Kód: [Vybrat]
int add(int x, int y) {
  return x - y
}

int sub(int x, int y) {
  return x - y
}

assert add(3, 2) == 5
assert sub(3, 2) == 1

anonym

Re:Typový system versus unittesty
« Odpověď #51 kdy: 18. 06. 2018, 14:16:01 »
Jsem nečetl celé vlákno, ale jednotkové testy jsem viděl na projektu v bance a je nutné si ujasnit, o co jde. Jednotkový test je myšleno otestování metod třídy izolovaně od ostatních tříd, tedy zahrnuje intenzivní mockování.

Když píšu nějakou metodu, tak si zároveň k ní udělám jednotkový test. Pokud dělám velký projekt, který bude v budoucnu velice složitý, udělám ten jendotkový test zpravidla vždy, i pro jednoduchou metodu. Zároveň to udělat muséím, protože se na takovém projektu měří test coverage. Zároveň si jednotkový test napíšu i v menším projektu ze svobodné vůle, protože mi šetří čas pro teď a i pro budoucnost: otestuju si tam, že metoda, kterou jsem právě napsal, nebo nějaká posloupnost metod, dělá to, co chci, aby dělala - tzn. místo abych otrocky pouštěl aplikaci, přihlašoval se do ní a zkoušel nově napsanou ufnkcionalitu, testuju si to tím unit testem a zároveń vyvíjím - je to značně rychlejší. Konrétní příklad: používám v metodě nějakou knihovnu a nejsem si jistý, jak funguje - např. knihovna pro parsování vstupních parametrů z konzole - udělám si proto k tomu unit test, ve kterém si ověřím, jak se vlastně ta knihovna chová.

Když někdo tvrdí, že Unit testy nejsou potřeba, když je silný typový systém, tak si myslím, že dotyčný dělá zřejmě v nějakém Pythonu nebo Javascriptu. Já dělám v javě, která silný typový systém má, a přesto se unit testy dělají, protože jejich primární goal je zafixovat chování kódu proti překlepům (někdo prostě napíš nechtěně něco do kódu, nevšimne si toho a pak to commitne, no a produkní incient e na světě), proti nevhodným změnám (někdo v kódu neotestuje na null něco, co null být může, a unit test to může podchytit), ba či přímo proti zásadním změnám funkce kódu. Unit testem taky můžu upozornit kolegy na to, že metoda, nebo její část, se opravdu musí chovat tak, jak je to v kódu - z různých důvodů.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Typový system versus unittesty
« Odpověď #52 kdy: 18. 06. 2018, 14:17:43 »
Bavíme se (doufám) o tvrzení, že typy plně nahradí unittesty. Nic víc neřeším.
Bavíme se o vašem tvrzení, že by unittesty byly plně nahrazeny typy.

Ukaž mi unittest s témže.
To opravdu takovou trivialitu neodkážete napsat sám? Tu chybu odhalí už takhle primitivní test, který nezkoumá žádné mezní stavy, ale prostě jen otestuje jeden jednoduchý nezajímavý případ.

Kód: [Vybrat]
int add(int x, int y) {
  return x - y
}

int sub(int x, int y) {
  return x - y
}

assert add(3, 2) == 5
assert sub(3, 2) == 1

To není to co tvrdíš.

Sorry, tvé příspěvky nejsou vůbec inspirativní. Nebudu se tedy tebou již zabejvat.

Re:Typový system versus unittesty
« Odpověď #53 kdy: 18. 06. 2018, 14:22:03 »
Bavíme se (doufám) o tvrzení, že typy plně nahradí unittesty. Nic víc neřeším.
Bavíme se o vašem tvrzení, že by unittesty byly plně nahrazeny typy.

Ukaž mi unittest s témže.
To opravdu takovou trivialitu neodkážete napsat sám? Tu chybu odhalí už takhle primitivní test, který nezkoumá žádné mezní stavy, ale prostě jen otestuje jeden jednoduchý nezajímavý případ.

Kód: [Vybrat]
int add(int x, int y) {
  return x - y
}

int sub(int x, int y) {
  return x - y
}

assert add(3, 2) == 5
assert sub(3, 2) == 1

To není to co tvrdíš.

Sorry, tvé příspěvky nejsou vůbec inspirativní. Nebudu se tedy tebou již zabejvat.

Chces inspiraci nebo jednoduchou a celkem rozumnou odpoved?

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Typový system versus unittesty
« Odpověď #54 kdy: 18. 06. 2018, 14:23:55 »
To není to co tvrdíš.

vyvrací to co tvrdíš ty.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Typový system versus unittesty
« Odpověď #55 kdy: 18. 06. 2018, 14:26:07 »
Já dělám v javě, která silný typový systém má,

Tak ano, Java silný typový systém má, ale co si budem povídat, stojí za starou belu. V porovnáním s takovou Scalou, a to přitom ani ta nevyužívá všeho, co se dá typy udělat.

Jinak k příkladům, které jsi uvedl: null, změna signatury, změna chování, překlep, dokumentace chování - to všechno typy zvládnou (zvládli by).

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Typový system versus unittesty
« Odpověď #56 kdy: 18. 06. 2018, 14:26:49 »
Jirsák by musel udělat tu stejnou chybu na dvou místech nezávisle, aby ji neodhalil. Tobě stačí překlep na jednom místě ve znaménku.

Re:Typový system versus unittesty
« Odpověď #57 kdy: 18. 06. 2018, 14:27:54 »
Já dělám v javě, která silný typový systém má, a přesto se unit testy dělají, protože jejich primární goal je zafixovat chování kódu (...)

Akorát nevím jestli je v původním dotazu míněn typový systém javy - hádám že jsou míněny mnohem silnější typové systémy, které toho garantují mnohem víc. Možná by mohl BoneFlute upřesnit?

Jinak taky záleží, jak kdo unit testy používá, někdo testuje skutečně izolovanou funkčnost, někdo to spíš používá jako integrační testy (testuje spolupráci více jednotek a třeba ani tolik nemockuje).

andy

Re:Typový system versus unittesty
« Odpověď #58 kdy: 18. 06. 2018, 14:30:58 »
Kód: [Vybrat]
(toJSON json) -> str == (fromJSON str) -> json by nešlo? Kompiler by musel ověřit, zda všechny varianty stromu, když se vygenerují do stringu a pak následně naparsují jsou shodné.
No, obvávám se, že to je ale obecně vzato nerozhodnutelný problém... (i.e. halting problem). tímpádem to řešit typy  nejde. Těch "všech variant stromu" může být nekonečno, takže to nejde ani po jednom projít.

Gődel

Re:Typový system versus unittesty
« Odpověď #59 kdy: 18. 06. 2018, 14:32:24 »
Celé mi to připadá jako souboj mezi funkcionálním a objektovým programováním. Zatímco funkcionální jazyky se opírají zejména o typy a dokazování správnosti, objektové jazyky se opírají zejména o testy. V tomto kontextu se nedá rozhodnout, co z nich je lepší.

Otázku bych tedy rozdělil na dvě:
  • Myslíte si, že ve funkcionálním jazyce, ve kterém máte kvalitní typový systém, jsou potřebné jednotkové testy?
  • Myslíte si, že v objektovém jazyce, ve kterém máte jednotkové testy, je potřebný typový systém?
Je to ortogonální, i v λ-kalkulu se striktní typovou kontrolou (takovému formalismu se ostatně říká “jednoduchá teorie typů”) se hodí testy.