První unit test, který většina lidí pokazí hned na začátku

Z Mazovia


Další častá chyba je testovat příliš mnoho najednou. Test, který ověřuje deset věcí, po prvním selhání neřekne, co je skutečně špatně. Rozdělte ho na menší celky. Zároveň se vyhněte testování implementačních detailů – pokud test kontroluje, že se zavolala konkrétní interní funkce, rozbije se při každém refaktoringu, i když se chování navenek nezmění. Testujte výsledek, ne cestu k němu.

Typická chyba je, že vývojáři vytvoří příliš věrnou kopii služby. Tráví hodiny implementací okrajových případů, které aplikace nikdy nepoužije. Další častou chybou je, že se fake chová jinak než realita – například vrací data v jiném formátu nebo neposílá hlavičky. Testy pak projdou, ale v produkci to spadne. Vždy si ověřte, že váš fake odpovídá skutečnému kontraktu, alespoň v tom, co aplikace konzumuje.

Escapování a validace nestačí jako hlavní obrana Ruční escapování uvozovek a jiných znaků je křehké. Snadno se zapomene na jeden vstup, na jinou znakovou sadu nebo nábytek na míru číselný parametr, kde se uvozovky vůbec nepoužívají. Podobně whitelist povolených znaků pomůže, ale nesmí být jediná vrstva. Validace je užitečná pro kontrolu formátu – e-mail, datum, číslo – ale bezpečnost dotazu musí stát nábytek na míru parametrizaci. Častá chyba je také spoléhat na to, že útočník neuhodne název tabulky nebo sloupce. Názvy se dají zjistit a skládat je z uživatelského vstupu je vždy riziko.

Další vrstvou je omezení práv databázového účtu. Aplikace nemá používat účet s právy správce. Stačí jí přístup jen k potřebným tabulkám a operacím. Když útočník i přes chybu získá možnost spustit dotaz, nemá pak jak číst systémové tabulky nebo vypnout server. Pomáhá i vypnutí podrobných chybových hlášení směrem k uživateli; chyby patří do logu, ne na obrazovku. Pravidelné testování vstupů a kontrola kódu odhalí místa, kde se dotazy skládají ručně. Bezpečnost není jednorázový úkol, ale opakovaná kontrola toho, co aplikace skutečně posílá do databáze.

Automatizace testů na CI serveru není o tom koupit ten nejlepší nástroj. Je to o tom nastavit pipeline tak, aby se testy spouštěly samy, spolehlivě a srozumitelně. Většina týmů to zbytečně komplikuje tím, že se snaží pokrýt všechno najednou. Přitom stačí začít u jedné věci: definovat, co se má stát po každém pushi do repozitáře. Pokud tento krok přeskočíte, budete mít drahý server a stejně ruční testování.

Název testu je polovina úspěchu Pojmenujte test tak, aby z názvu bylo jasné, co se ověřuje a za jakých podmínek. Místo „testFunkce" použijte třeba „vrací_nulu_pro_prazdny_seznam". Když test po půl roce spadne, If you cherished this article and you simply would like to obtain more info regarding osvětlení v obýváku i implore you to visit our own internet site. název vám řekne, co se rozbilo, ještě než otevřete kód. Do těla testu pak patří tři části: příprava vstupu, zavolání testované funkce a ověření výsledku. Tyto tři kroky oddělte prázdným řádkem, i když jsou krátké.

SQL injection vzniká ve chvíli, úprava interiéru kdy aplikace vloží vstup od uživatele přímo do databázového dotazu. Útočník pak místo očekávané hodnoty pošle fragment SQL, který změní význam celého příkazu. Nejde o okrajový problém – stačí jeden neošetřený parametr a útočník může číst cizí data, mazat tabulky nebo si přes databázi otevřít cestu k dalším částem systému.

Začněte tím, že si vyberete jednu malou funkci, ideálně takovou, která nemá vedlejší efekty. Nemá smysl testovat metodu, která zapisuje do databáze, posílá e-maily a ještě formátuje text. Rozdělte ji nebo otestujte jen čistou část. Test má být rychlý, spustitelný bez sítě a bez přípravy složitého prostředí. Pokud příprava testu zabere víc času než samotný test, je něco špatně v návrhu kódu, ne v testu.

První unit test vzniká většinou ve chvíli, kdy je funkce hotová a funguje. To je přesně ten moment, kdy se dělá nejvíc chyb. Test napsaný zpětně často jen opisuje současné chování kódu, včetně jeho nedostatků. Pokud chcete, aby měl test skutečnou hodnotu, napište ho dřív, než dokončíte implementaci. Stačí vědět, co má funkce vracet pro konkrétní vstup, a teprve pak ji dodělat.

Testování Redux logiky bez integračního prostředí znamená, že se soustředíte na čisté funkce. Reducer je jen funkce, která přijme stav a akci a vrátí nový stav. Nepotřebujete k tomu běžící aplikaci, síť ani DOM. Stačí testovací runner, například vestavěný ve vašem nástroji pro build, a knihovna pro assertions. Pokud používáte TypeScript, ještě před spuštěním testů zkontrolujte, že typy akcí sedí – většina chyb vzniká právě na rozhraní mezi akcí a reducerem.

Základem obrany je parametrizovaný dotaz. Místo skládání řetězců použijte připravený dotaz s placeholdery a hodnoty předejte zvlášť. V praxi to znamená, že SQL část je pevně daná a databázový ovladač sám zajistí, že vstup zůstane daty, ne kódem. Tento jeden krok odstraní většinu běžných útoků. Pokud jazyk nebo knihovna připravené dotazy nepodporuje, je to signál k výměně nástroje, ne k ručnímu escapování.