Jak vyvážit testy, když kód roste rychleji než vaše trpělivost

Z Mazovia


Když zákazník přijde s požadavkem na termín, většina z nás instinktivně řekne jediné číslo. If you have any type of inquiries concerning where and zdroj informací ways to utilize dokončení Interiéru, you can call us at our own web-site. Třeba „budu to mít ve čtvrtek". Problém je, že takový odhad je téměř vždy lež – ne proto, že byste chtěli klamat, ale protože neznáte všechny proměnné. Může se objevit chyba v kódu, dodatečný požadavek nebo jen špatně odhadnutá složitost úkolu. A když slíbíte konkrétní den a nedodržíte ho, ztrácíte důvěru rychleji, než byste čekali. Řešení není v tom, že budete odhadovat s větší rezervou. Řešení je změnit způsob, jakým o čase mluvíte.
Současně s tím zavedte verzování API a jeho promítnutí do dokumentace. Pokud přidáváte nové pole, přidejte ho jako nepovinné, aby starší klienti fungovali dál. Pokud měníte existující chování, navyšte verzi a starou verzi ponechte funkční po dobu, po kterou se frontend přizpůsobí. Každá verze by měla mít vlastní sekci, kde je jasně uvedeno, co se změnilo a od kdy. Bez toho se stane, že frontend náhodně volá starší endpoint, který už nepodporuje novou funkcionalitu, a výsledek je matoucí.

Když frontendový a backendový tým pracují na jednom projektu, nejčastějším zdrojem nedorozumění bývá nejednoznačná nebo zastaralá dokumentace API. Než začnete sepisovat první řádky, stanovte si jednotný popisný formát, který bude strojově čitelný. Nejde o to napsat román, ale o to, aby si každý nový člen týmu během pěti minut našel, jaký endpoint volá, s jakými parametry a co přesně očekávat v odpovědi. Bez této společné referenční kostry se brzy objeví rozpory, které se pak řeší dlouhými diskusemi na chatu.

Prvním častým problémem je destrukce objektů a polí. Zápis const x, y = point je sám o sobě jasný, ale pozor na výchozí hodnoty. Pokud chcete nastavit fallback pro undefined, píšete const x = 10 = obj. To funguje pouze pro undefined, ne pro null nebo prázdný řetězec. Tuto skutečnost lidé často přehlédnou a pak v kódu řeší neočekávané chování. Stejně tak při destrukci pole pomocí const [a, b] = arr se vyplatí ověřit, zda pole vůbec existuje – destrukturování null nebo undefined vyhodí chybu, takže je lepší nejdřív zkontrolovat hodnotu.

Než začnete psát další test, zastavte se a položte si otázku: Co přesně tento test chrání? Mnoho týmů upadne do pasti, kdy s každým novým feature přibývají desítky testů, ale jejich hodnota klesá. Jednotkové testy, které testují implementaci místo chování, se stávají balastem. Integrační testy zase trvají dlouho a při sebemenší změně se rozpadají. Klíčem je najít rovnováhu, která odpovídá aktuální velikosti kódu a rychlosti jeho změn.
Nejčastější chybou začátečníků je používání docker run bez parametrů, které omezují zdroje nebo síť. Můžete snadno spustit kontejner, který sebere veškerou paměť hostitele. Vždy proto používejte omezení, například -m 512m pro paměť a --cpus=1 pro procesor. Také si dejte pozor na to, že kontejnery běží pod uživatelem root, pokud to výslovně nezměníte. Pro produkci vytvořte v Dockerfile uživatele s nižšími právy, jinak riskujete bezpečnostní problémy.

Důležité je myslet na izolaci a životnost kontejnerů Kontejnery jsou ze své podstaty dočasné. Když kontejner zastavíte nebo ho smažete, přijdete o všechna data, která jste do něj zapsali. To je častý zdroj frustrace. Řešení? Používejte takzvané svazky (volumes), které umožní uchovat data i po smazání kontejneru. Například docker run -v /data mysql vytvoří svazek, který přežije i restart. Stejně tak si zvykněte na to, že kontejnery by měly být bezstavové — pokud potřebujete ukládat data, dělejte to do svazků, ne do kontejneru.

Když codebase roste, nevyhnete se ani nutnosti testovat legacy kód. Zde platí pravidlo: nejprve zabezpečete nejrizikovější místa pomocí charakterizačních testů, které zachovají stávající chování, a teprve poté začnete psát nové jednotkové testy. Nezkoušejte pokrýt všechno najednou – vyberte si moduly, které se mění nejčastěji, a tam postupně zvyšujte hustotu testů. Nezapomínejte, že testy také potřebují údržbu. Pokud test selže jen kvůli špatné konfiguraci, opravte to hned, jinak vás tým přestane testy brát vážně.

Druhým bodem jsou šablony literálů. Místo zalamování řetězců přes + můžete psát víceřádkové texty přímo, ale pozor na bílé znaky. Šablona zachovává všechny mezery a odřádkování tak, jak zařídit malou kuchyni jsou zapsané, což někdy způsobí nečekané mezery ve osvětlení v obývákuýstupu. Řešením je buď opatrné psaní, nebo použití funkce, která řádky ořeže. Také je dobré vědět, že uvnitř ${} můžete provádět složitější výrazy, ale neměli byste tam volat funkce s vedlejšími efekty – šablona se vyhodnotí při každém použití, takže pokud funkce mění stav, dostanete nekonzistentní výsledky.