Proč si komplikovat CI, když testy zvládne i jednoduchý skript?

Z Mazovia


Vrchol pyramidy patří end-to-end scénářům. Mají být vzácné a pokrývat jen kritické cesty: přihlášení, dokončení objednávky, odeslání platby. Každý další end-to-end test prodlužuje běh a zvyšuje křehkost. If you cherished this article therefore you would like to acquire more info concerning Proměna Bytu nicely visit our own website. Častý omyl je nahrazovat jimi integrační vrstvu – výsledkem je pomalý pipeline, který padá z nesouvisejících důvodů, a tým přestane výsledkům věřit. Když end-to-end test selže, musí být z logu okamžitě jasné, která část systému selhala. Jinak ho nikdo neopraví, jen restartuje.

U revize neodhadujte podle řádků kódu, ale podle počtu rozhodnutí, která musí recenzent udělat. Malá změna v jedné funkci znamená jedno rozhodnutí. Změna, která zasahuje do datového modelu, rozhraní a testů, jich má několik. Pro každé rozhodnutí počítejte s krátkým blokem času. U úprav pak platí, že ne všechny připomínky jsou stejně náročné. Některé jsou kosmetické a zaberou minuty, jiné mohou znamenat přepsání celé logiky.

Kdy je čas přidat druhou úlohu Jakmile máte jeden běh stabilní, přidejte druhou úlohu jen pro věci, které se opravdu liší. Například testy na jiné verzi jazyka nebo lint. Nezavádějte je proto, že to dělají ostatní. Každá další úloha znamená delší čekání a víc míst, kde může něco tiše selhat. Sledujte dobu běhu. Pokud testy trvají déle než několik minut, hledejte pomalé testy, ne další paralelizaci.

Sdílená verze znamená, že při každém vydání zvýšíte jedno číslo a publikujete všechny balíčky najednou. osvětlení v obývákuýhoda je v tom, že vždy víte, které balíčky k sobě patří, a závislosti mezi nimi stačí zapisovat pevně. Nástroje na správu monorepa to podporují nativně, takže konfigurace je krátká. Jenže sdílená verze nutí publikovat i balíčky, které se vůbec nezměnily, a při větším počtu balíčků se vydávání stáúložné prostory v malém bytěá těžkopádným.

Nakonec testuj chování, ne implementaci. Napiš testy pro úspěšnou cestu, neplatný vstup, chybějící oprávnění a chybu databáze. Právě tyto čtyři scénáře odhalí většinu problémů, které se v produkci projeví až ve chvíli, kdy to bolí nejvíc.

Express je minimalistický framework, který toho sám o sobě moc neřeší. Právě proto se v něm snadno napíše endpoint, který funguje na localhostu, ale v produkci padá nebo tiše vrací špatná data. Rozdíl mezi funkčním prototypem a API, které vydrží provoz, není v počtu řádků, ale v pár rozhodnutích, která uděláš hned na začátku.

Na asynchronní kód pozor. Od Expressu 5 se zamítnuté promise předávají do error handleru automaticky, ve starších verzích musíš volat next(err) ručně. Blokující operace, jako je čtení velkého souboru synchronně, zablokují celý event loop a pod zátěží položí server. Pro databázi používej pool připojení, ne nové připojení na každý požadavek.

Automatizace testů na CI serveru nemusí znamenat složitý pipeline s desítkami pluginů. Většina projektů si vystačí s jedním skriptem, který po každém commitu spustí testy, zapíše výsledek a případně zastaví build. Pokud začínáte, vyhněte se snaze pokrýt všechno najednou. Začněte tím, že na CI serveru spustíte stejný příkaz, jaký používáte lokálně. Když funguje na vašem počítači, má fungovat i tam.

Validace, chyby a stavové kódy Validuj vstup na hranici API, ne až v databázi. Knihovna jako Joi, Zod nebo ruční kontrola musí vrátit odpověď se stavovým kódem 400 ještě předtím, než se dotkneš databáze. Chyby nepolykej v prázdném catch bloku. Centrální error handler s parametry (err, req, res, next) musí být zaregistrovaný až za všemi routami, jinak se k němu chyba nikdy nedostane. Rozlišuj 400 (špatný vstup), 401 (nepřihlášený), rekonstrukce koupelny krok za krokem 403 (nemá oprávnění), 404 (nenalezeno) a 500 (chyba na tvé straně). Vracení 200 u chyby je klasika, která klientům rozbije logiku.

Kurzor má i svá úskalí. Musí být stabilní, tedy řazený podle sloupce, který se nemění. Řazení podle data úpravy se rozbije při každé editaci. Pokud kurzor podepisujete nebo šifrujete, dejte pozor na expiraci a na to, že klient ho nesmí skládat ručně. A vždycky definujte chování, když kurzor odkazuje na smazaný záznam — tady vzniká nejvíc chyb v produkci.

Pozor na prostředí. CI server často běží v kontejneru bez přístupu k lokálním službám. Testy, které spoléhají na databázi nebo frontu, musí mít vlastní instanci nebo nahrazení. Není dobré spoléhat na to, že na CI je něco nainstalované. Do skriptu patří explicitní instalace a kontrola verze. Další častá chyba je ukládat tajné klíče do repozitáře. Používejte proměnné prostředí, které CI server umí nastavit.

Výsledky testů musí být čitelné. Nechte CI zapsat krátký souhrn: počet úspěšných, selhaných a přeskočených testů. Pokud něco selže, chcete vidět jen relevantní výstup, ne tisíce řádků logu. Nastavte, aby se log ukládal jako artefakt. Když se build opakovaně zhroutí, zkontrolujte časový limit a dostupnou paměť. Někdy stačí zvýšit limit, jindy je problém v testu, který čeká na něco, co nikdy nepřijde.