Co je ještě unit test? rubrika: Programování: Jiné

8 v6ak
položil/-a 19.5.2015

Někdy slýchám, že pokud pracuju s DB, tak už nejde o unit test, protože testuju integraci s větším celkem. No jo, ale:

  • Platí stejný argument, pokud použiju nějakou embedded databázi?
  • Dá se stejný argument použít i na String? Tzn. pokud používám nenamockovaný String a volám na něm třeba length(), jde o integrační test?

Já vnímám unit testy jako testy nad co nejmenší smysluplnou jednotkou kódu, tedy pokud chci testovat logiku, tak do toho netahám UI. Ale ne vždy má smysl si vše mockovat.

  • Mockování String.length() mi přijde jako evidentní nesmysl.
  • Mockování DB má možná smysl v některých speciálních případech (testování ORM), ale spíše výjimečně.
  • Pokud chci otestovat, zda můj kód dává smysluplné dotazy do databáze, tak nebudu zkoumat, zda výsledné SQL odpovídá očekávání. Proti čemu bych to testovat? Ručně bych napsal SQL dotaz, který z toho má vypadnout? Tím ale ošetřím spíše drobné syntaktické chyby ve výsledném SQL (např. chybějící mezera), jinak tím nic neotestuju. Já radši nechám ten dotaz vykonat na skutečné DB a porovnám výsledky. Tím otestuju kód na logické chyby.

Jak se na to díváte vy? Může se test proti skutečné databázi (na testovacích datech) nazývat unit testem? A může se test proti skutečnému Stringu nazývat unit testem? Pokud jste na tyto dvě otázky odpověděly různě (např. String je OK, ale databáze ne), kde vidíte ten principiální rozdíl?

Je hranice mezi unit testem a integračním testem ostrá, nebo tu je nějaká šedá zóna?

Komentáře

  • arron : Čistě na zamyšlení...píšeš, že když se použije ORM, tak že bych přístup do DB mockoval. Proč? Jaký je rozdíl, když použiješ třeba PDO nebo Dibi (kde, jak jsem pochopil, bys ten mock nedělal)? 20.5.2015
  • v6ak : To ORM jsem myslel testy samotného ORM, tedy pokud bych vyvíjel nové ORM, pak by možná měly smysl testy výsledného SQL. I když i to je otázka, u složitějšího generování dotazů takové testy mohou být opět křehké. 20.5.2015
odkaz
6 Žížala
odpověděl/-a 20.5.2015

Po 25 letech programování je pro mě unit test to, co testuji na mém počítači během vývoje a je to test na malou izolovanou funkčnost. I když ta fukčnost může zahrnovat přístup do db, pořád to bude unit test, protože třeba testuji funkci "načti z db data podle těchto kritérií a vrať mi data v nějakém formátu". To je 1 funkce, která zahrnuje SQL dotaz/y, validace a konverzi dat. Ale pořád je to jedna "unita", kterou má cenu testovat.

Podle mě totiž atomizace unit testů je podobná návrhu DB, kde také děláte nejdříve atomizaci a pak zase deatomizaci, protože pak by DB nebyla efektivní. A to samé platí pro unit testy. Unit test je pro mě testem jedné funkce, která může volat i jiné funkce. I na tyto podfunkce ale může být napsán unit test, pokud jsou využívány i z jiných funkcí. Pokud nejsou, nedělám na ně unit test a testuji pouze nadřazenou funkci. Jinak bych se utestoval.

Integrační testy(ITG) jsou testy, kdy zasazujete aplikaci do prostředí podobného produkci aby se otestovala její funkčnost/kompatibilita v rámci ekosystému, odchytali případné side efekty, problémy s právy a pod.

Po ITG násletují UAT, což jsou uživatelské akceptační testy, kde už se spíše testuje, zda aplikace dělá to co má, nedělá logické chyby a zda je v pořádku UI atd.

Pro zobrazení všech 5 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.