Co rozhoduje o přijetí do testování, když nemáte praxi?

Z Mazovia

Jak na asynchronní kód bez bolesti Třetí funkce, která změní váš přístup k asynchronnímu kódu, je `async/await`. Namísto řetězení `Promise.then()` a záplatování chyb v `catch` píšete sekvenční kód, který se snadno čte i ladí. Nezapomínejte ale, že `await` funguje jen uvnitř funkcí označených `async`. Při volání bez `try/catch` se chyba přenese na volajícího – pokud ji tam nechytíte, skončí jako unhandled rejection. Praktické je kombinovat `async/await` s `Promise.all`, když potřebujete paralelně načíst data.

První praktické kroky, které nahradí chybějící zkušenosti Začněte u vlastního prostředí. Vyberte si běžnou webovou aplikaci, kterou používáte denně, a začněte ji testovat systematicky. Vytvořte si jednoduchou tabulku, kam si budete zapisovat jednotlivé testovací scénáře, kroky, očekávané výsledky a skutečné chování. Zkuste se zaměřit na okrajové případy, prázdná pole, nezvyklé délky textu nebo opakované odeslání formuláře. Tento vlastní projekt je vaším portfoliem, které můžete ukázat u pohovoru.

Nejdůležitější je číst dokumentaci a testovat na malém vzorku Dokumentace není jen nudný text — je to smlouva mezi vámi a poskytovatelem služby. Najdete tam, jaké metody jsou dostupné, jaké parametry přijímají a jaká je struktura odpovědi. Než začnete psát kód, přečtěte si sekci o autentizaci. Většina API vyžaduje klíč, který posíláte v hlavičce požadavku. Nikdy nedávejte tento klíč přímo do kódu, který by se mohl dostat na veřejnost — ukládejte ho do proměnných prostředí nebo do konfiguračního souboru, který není verzovaný. Pokud klíč omylem zveřejníte, okamžitě ho zneplatněte a vygenerujte nový.

Jakmile rozumíte odpovědím, začněte psát vlastní kód. Většina jazyků má knihovny, které práci s API výrazně zjednoduší. V Pythonu je to třeba knihovna na HTTP požadavky, v JavaScriptu pak funkce fetch. Nezapomeňte na dvě věci: vždy nastavte časový limit, aby se váš program nezasekl, a vždy zpracujte chyby — nepočítejte s tím, že API odpoví přesně podle dokumentace. Typická začátečnická chyba je ignorovat chybové stavy a předpokládat, že data jsou vždy ve stejném formátu.

Osvojení těchto pěti funkcí vám ušetří hodiny ladění a zpřehlední projekty. Začněte postupně – nejdřív destructuring a spread v malých funkcích, pak přejděte k async/await a modulům. Kód, který napíšete s těmito nástroji, bude nejen modernější, ale hlavně robustnější a jednodušší na údržbu.

Vyplatí se také sledovat čas běhu testů. Když se jednotkové testy zpomalí nad pár sekund, podívejte se, jestli nepoužívají zbytečné závislosti. Integrační testy by měly běžet v řádu minut, e2e maximálně v desítkách minut. Pokud váš e2e běh trvá hodiny, je to známka toho, že máte v pyramidě příliš mnoho vrstev navrchu. Postupně přesouvejte část testů dolů – nahraďte e2e test integračním tam, kde to jde. Testovací pyramida není statická, je to živý proces, který se vyvíjí s projektem.

Nakonec si hlídejte výkonnost celé aplikace. Redux je skvělý nástroj, ale pokud ho používáte na každou drobnost, stává se přítěží. Použijte React.memo nebo useMemo na komponenty, které odebírají data ze store, a zvažte, zda některé části stavu nemají zůstat lokální. Pokud aplikace začne být pomalá, zkontrolujte, kolik komponent se re-renderuje při jedné akci – to je ukazatel, že máte příliš mnoho závislostí. Dobrým testem je přidat do komponenty console.log s názvem komponenty a sledovat, kdy se loguje. Často zjistíte, že se vykreslují i ty, které se změny netýkají.

Při psaní prvních funkcí se držte jednoduchosti. Vyberte si jeden zdroj dat, třeba počasí nebo seznam článků, a zpracujte odpověď tak, abyste ji zobrazili v konzoli. Pak zkuste přidat filtr nebo třídění. Dávejte pozor na limit počtu požadavků — pokud na něj narazíte, musíte počkat nebo použít kurzor pro stránkování. Nikdy neposílejte víc volání, než je nutné. Místo abyste každých pět sekund dotazovali API na data, která se nemění, ukládejte si je lokálně a aktualizujte jen tehdy, když to dává smysl.

Jak správně strukturovat akce a reducery, aby se aplikace nezacyklila Další oblast, kde se dělá hodně chyb, je návrh akcí a reducerů. Mnoho vývojářů píše reducery tak, že mění stav více úrovní do hloubky pomocí spread operátoru, ale zapomíná, že každá taková změna musí být neměnná. Pokud přímo změníte část stavu, Redux si toho nevšimne a aplikace se neaktualizuje. Proto vždy vytvářejte nové objekty a pole. Prakticky to znamená: místo abyste dělali state.items.push(newItem), vraťte nové pole rozšířené o novou položku. To je základ, ale pozor na to, že hluboká struktura stavu vyžaduje složité kopírování, které je náchylné na chyby. Řešením je normalizovat stav – držte data jako slovník podle id, ne jako vnořená pole.