Používáte „vývoj programu řízený testy“?

Viky

Re:Používáte „vývoj programu řízený testy“?
« Odpověď #45 kdy: 07. 05. 2012, 21:05:24 »
Zásadním rozdílem je to, že assert není testem, nýbrž jen formou kontroly - pouze ověřuje, že data, jež někam předávám nebo odněkud získávám splňují nějaké podmínky. Že kde je očekáváno číslo opravdu bude číslo, že kde je očekáván chybový kód bude opravdu chybový kód a ne nějaké nespecifikované hausnumero.

Unit test není kontrolou, ale testem. Tj. krmí náš program (modul, funkci...) sadou testovacích dat a odškrtává si, zda na ně přišla očekávaná reakce.

Příklad:
Program na výpočet dne v týdnu na základě data můžu vybavit assertem, jenž ověří, že měsíc je 1:12 a den je 1:28, resp. 29, resp. 30, resp. 31 v závislosti na měsíci a přestupnosti daného roku. Ale test bude tomu programu předhazovat sérii různých kombinací dnů, měsíců a roků a bude testovat, zda přišla očekávaná odezva - tj. správný (předem vypočtený) den v roce, resp. správný typ chyby v případě úmyslně nesprávných dat. To assert nedovede. Assert jen kontroluje. Assert netestuje. Kontrola je defenzivní, zatímco test je ofenzivní.

Report assertu: chyba - zadán nesprávný počet dní v měsicí (29 v únoru nepřestupného roku).
Report unit testu: a.b.abcd - úterý (OK), e.f.efgh - sobota (OK), g.h.ghij - chybný počet dní, ghij nebyl přestupný (OK), i.j.1570 - středa (FAILED! správně má být úterý)
A je nám hned jasné, že programátor zapomněl na kalendářní reformu. Nevím, jak tuhle chybu odhalí assert.


Franta

Re:Používáte „vývoj programu řízený testy“?
« Odpověď #46 kdy: 07. 05. 2012, 22:07:44 »
To je vsechno sice hezke, ale kde je tvoje pointa a jak to souvisi s TDD? Vsechno, co jsi rekl, jsem uz naznacoval vys v diskusi. Nejsem proti unit testum, jsem proti urcitemu zpusobu jejich pouzivani. A jasne jsem napsal, ze pokud toto je TDD, je to proste spatna metodologie.

Může být… Ale jak se rozhodneš, že program už je dokonalý nebo aspoň dost dobrý na to, abys ho pustil do světa? Budeš hodnotit spíš ten vnitřek programu (koukat programátorovi přes rameno a ptát se ho, jestli rozumí každému řádku a stojí si za ním) nebo spíš chování programu, které ověříš nějakým testem (klidně manuálním, nemusí být automatický a už vůbec ne jednotkový)?

Franta

Re:Používáte „vývoj programu řízený testy“?
« Odpověď #47 kdy: 07. 05. 2012, 22:13:20 »
Zásadním rozdílem je to, že assert není testem, nýbrž jen formou kontroly - pouze ověřuje, že data, jež někam předávám nebo odněkud získávám splňují nějaké podmínky. Že kde je očekáváno číslo opravdu bude číslo, že kde je očekáván chybový kód bude opravdu chybový kód a ne nějaké nespecifikované hausnumero.

Proto je lepší nepoužívat obecné typy (int, string atd.), ale nějaké vlastní, kde si ohlídáš, že můžou nabývat jen těch správných hodnot (např. že věk osoby nemůže být záporný a nemůže být větší než třeba 200 let nebo že e-mailová adresa není obyčejný String, ale musí splňovat určité podmínky). A pak není potřeba ani ten assert.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Používáte „vývoj programu řízený testy“?
« Odpověď #48 kdy: 06. 06. 2012, 02:11:01 »
Před časem jsem začal přemýšlet nad tím, k čemu jsou jazyky s dynamickým typováním - konkrétně python a jeho ducktyping. Nemyslím tím vlastní jazyk, ale právě tu netypovost. Vždyť staticky typované jazyky jsou mnohem pohodlnější. Počínaje nápovědou IDE a konče tím, že si navrhnu applikací pomocí tříd a pak ho tak nějak seskládám do hromady.
Samozřejmě trošku zjednodušuji, ale ten pocit jsem měl.

Díky příspěvkům v tomto vlákně jsem to zdá se pochopil. Zkusím to rozebrat, třeba mi k tomu řeknete něco zajímavého.

Vezměme si třeba takovou Javu jako zástupce staticky typovaného jazyka (Ada by prý byla lepší, ale nemám zkušenosti). V Javě si logiku programu rozdělím do jednotlivých tříd, nejlépe podle návrhových vzorů. Tyto třídy si otestuji, zda dělají co mají, vytvořím instance těchto tříd a pak se mi aplikace skoro sama poskládá z těchto instancí. Přeložím a mám hotovo. Samozřejmě to není jen tak. Díky tomu, že vytvářím konkrétní typy tříd, tak mi půlku pracovní doby trvá, než vychytám všechny ty typové nesoulady.

V případě Pythonu, jako zástupce dynamického typování, to bude podobné, s tím rozdílem, že zde nemám tu kostru typové kontroly. Tudíž na jednu stranu nic mi nebrání jako parametr nějaké metody dát zcela cokoliv, a díky tomu se pěkně zamotat v chybách zanořených v naprosto nečekaných místech, na druhou stranu nemusím se s překladačem dohadovat kdo má pravdu. O různých kouzlech ani nemluvě.

Uvažoval jsem dál, k čemu je tedy dobrá ta silná typová kontrola. Tak například když budu psát unittesty pro Javu, tak nemusím kontrolovat, zda mi do objektu vlezl správný objekt. To mi ošetří překladač. (V Pythonu musím ověřit nejen, že mi tam vlezl správný objekt, ale také, zda je validní.) To znamená, že když bych byl schopen vytvořit typ, který určí, že hodnotou instance můžou být pouze řetězce reprezentující validní email, nemusím v žádném unittestu kontrolovat, zda příchozí instance emalu obsahuje validní hodnotu. (Samozřejmě unittest pro ten vlastní typ napsat musím.) Takže když postoupím o krok dál v úvaze, když bych byl schopen vytořit pro každý typ pravidlo, které normálně píšu do integračních, nebo dokonce do unittestů, nemusel bych pak tyto testy psát. Každé přeložení zdrojáků by bylo zároveň korektní prověření testů. O Adě se říká, že jakmile ji jednou přeložíte, tak funguje bez chyby. U Javy to tedy evidentně nestačí, a nějaké ty testy psát musíme. Ale kdyby...

A tak si možná návrháři pythonu řekli, že když je tak těžký dotáhnout tu typovou kontrolu do stavu, kdy by stačil jen překlad, tak co na to jít z druhé strany? Vykašlat se na typy úplně, nechat je jen jako informaci pro reflexi, a říct vývojáři, že odměnou za to, že bude psát více testů je to, že ho kompilátor nebude tolik otravovat.

Ono psát v pythonu bez testů prostě nejde.

Re:Používáte „vývoj programu řízený testy“?
« Odpověď #49 kdy: 06. 06. 2012, 03:17:24 »
kompilator tu neni od toho aby te buzeroval, ale aby te upozornoval na chyby. Beru ho spis jako radce a ne kretena kterej mi rika co a kde mam spatne


podlesh

Re:Používáte „vývoj programu řízený testy“?
« Odpověď #50 kdy: 06. 06. 2012, 11:01:21 »
O Adě se říká, že jakmile ji jednou přeložíte, tak funguje bez chyby. U Javy to tedy evidentně nestačí, a nějaké ty testy psát musíme. Ale kdyby...
Ada je od toho hodně daleko, spíš se tomu blíží Haskell (a troufám si říci že je to jeho nosná myšlenka).

Jinak celkově se se o pomůcky pro lidi, ne pro stroje. Na výsledné programy to teoreticky nemá žádný vliv.

Inkvizitor

Re:Používáte „vývoj programu řízený testy“?
« Odpověď #51 kdy: 06. 06. 2012, 12:37:10 »
O Adě se říká, že jakmile ji jednou přeložíte, tak funguje bez chyby. U Javy to tedy evidentně nestačí, a nějaké ty testy psát musíme. Ale kdyby...
Ada je od toho hodně daleko, spíš se tomu blíží Haskell (a troufám si říci že je to jeho nosná myšlenka).

Je jasné, že dobrý typový systém (a Haskell má zřejmě jeden z nejlepších) pomáhá hodně a věci, které umí např. Template Haskell (typová kontrola formátovacích parametrů pro *printf při kompilaci a podobné možnosti), se jinde moc nevidí. Na druhou stranu, projekty typu Darcs ukazují, že Haskell sám o sobě všechny chyby nevychytá.