Prakticky začněte exportem dat. Použijte nástroje, které umí zapsat data do formátu SQL nebo CSV. U CSV si dejte pozor na oddělovače, kódování a na to, jak jsou reprezentovány binární hodnoty. U SQL dumpu zase na to, zda exportujete strukturu a data odděleně. Před importem do PostgreSQL vypněte kontroly cizích klíčů a indexy – urychlíte tím nahrávání. Indexy a constrainty pak vytvořte až po dokončení importu.
Pokrytí testy je oblíbená metrika, ale jen málokdo ví, jak ji správně měřit. Většina týmů se zaměří na procento řádků, které testy projdou, a zapomene, že číslo samo o sobě neříká nic o kvalitě testů. Když se pokrytí blíží sto procentům, může to vypadat skvěle, ale ve skutečnosti to často znamená, že testy jsou povrchní a netestují klíčové scénáře. Jak tedy měřit pokrytí správně a kdy přestat honit čísla?
Dalším častým pochybením je zřetězení řetězců při sestavování dotazů. Pokud skládáte SQL z proměnných bez použití prepared statements, dříve či později uděláte chybu. Stejně riskantní je dynamické sestavování dotazů podle uživatelských voleb, kde se může útočník dostat k nevyžádané části WHERE či ORDER BY. V takových případech vždy mapujte vstup na předem definované povolené hodnoty, nikoli na přímo zadaný text.
Nezapomínejte také na to, že pokrytí testy není cíl, ale prostředek. Mnohem důležitější je, aby testy byly rychlé, spolehlivé a vypovídající. Pokud vám testy trvají desítky minut, nikdo je nebude spouštět často, a pokrytí tak ztrácí smysl. Proto se vyplatí investovat do testů, které běží rychle, a do údržby testovací infrastruktury. Když vám pokrytí klesne o pár procent, ale testy jsou rychlejší a stabilnější, je to často lepší kompromis než honit čísla za každou cenu.
Prakticky to uděláte tak, že si v nástroji pro měření pokrytí nastavíte hlášení o tom, které řádky nebyly pokryty, a pravidelně si je prohlížíte. Když najdete nepokrytý řádek, zeptejte se sami sebe, proč tam je. Pokud je to obsluha chyby, kterou testy nikdy nevyvolají, možná je v pořádku, že ji testy neprocházejí – ale pokud je to hlavní logika, máte problém. Dalším krokem je měření pokrytí mutací, které vám řekne, jestli testy skutečně odhalí chyby. Tato metoda spočívá v tom, že se do kódu záměrně vloží drobné změny (mutace) a zjistí se, kolik z nich testy odhalí. Pokud je mutační skóre nízké, vaše testy jsou slabé, i když je řádkové pokrytí vysoké.
Druhým klíčovým opatřením je striktní validace vstupů. Nikdy nevěřte uživatelským datům. Ověřte, že vstup odpovídá očekávanému formátu – číslo musí být číslo, e-mail musí mít správnou strukturu. Používejte whitelist povolených znaků a odmítejte vše ostatní. Vyvarujte se pouhému escapování speciálních znaků, protože tato metoda je náchylná na chyby a v některých kontextech je nedostatečná. Raději kombinujte validaci s parametrizací.
Typickou chybou je přímý přepis SQL dotazů. V PostgreSQL nefunguje LIMIT s čárkou jako v MySQL – musíte použít klauzuli OFFSET. Dále se liší funkce pro práci s řetězci a datem, např. DATE_FORMAT nemá přímou obdobu, používá se TO_CHAR. Pokud ve svých dotazech používáte backticks pro označení sloupců, v PostgreSQL je nahraďte uvozovkami a dbejte na malá a velká písmena, protože PostgreSQL rozlišuje citlivost identifikátorů.
Pojďme si ukázat konkrétní případ. Máte funkci, která čte konfiguraci z globální proměnné. Napíšete test, který tuto proměnnou nastaví, a hned záhy test, který ji čte. První test projde, druhý selže, protože první test proměnnou nevrátil do původního stavu. Řešení? Použijte fixture s rozsahem function, která před každým testem nastaví výchozí hodnotu. A hlavně – nikdy neměňte globální stav napřímo v testovací funkci. Vždy to udělejte přes fixture, která se postará o úklid.
SQL injection patří mezi nejčastější a nejnebezpečnější zranitelnosti webových aplikací. Útočník vloží do vstupního pole či URL parametry speciálně upravený SQL příkaz, který může aplikace vykonat místo původního dotazu. Výsledkem bývá neoprávněný přístup k datům, jejich modifikace nebo dokonce úplné smazání databáze. Přitom stačí dodržet několik základních principů, které riziko prakticky eliminují.
Druhým krokem je práce s vizuální hierarchií. Uživatel by měl na první pohled vidět, co je nejdůležitější. Vytvořte jasný kontrast mezi primárním a sekundárním prvkem – hlavní akční tlačítko zvýrazněte, vedlejší akce ztlumte nebo umístěte stranou. Nezapomeňte na dostatečné mezery mezi prvky; přeplácané obrazovky působí chaoticky a zvyšují chybovost. Místo mnoha barev použijte jednu akcentovou barvu pro interakce a neutrální pro pozadí. Testujte také čitelnost textu – minimální velikost písma pro běžný obsah by měla být alespoň 16 pixelů, a to nejen na mobilu.