Instalace je přímočará. Vytvořte virtuální prostředí, aktivujte ho a nainstalujte pytest pomocí správce balíčků. Ověření provedete příkazem pytest --version. Testy se ukládají do souborů, jejichž název začíná na test_ nebo končí na _test. Samotné testovací funkce musí mít také prefix test_. pytest je sám najde bez jakékoli registrace. Spuštění je pak otázkou příkazu pytest v kořeni projektu. Pro podrobnější výstup použijte pytest -v, pro zastavení po první chybě pytest -x.
Základní dělení je na permisivní a copyleftové licence. Permisivní licence, jako MIT, BSD nebo Apache, dovolují kód použít i v uzavřených produktech, stačí zachovat autorskou informaci a text licence. Copyleftové licence, například GPL nebo AGPL, naopak vyžadují, aby odvozená díla zůstala pod stejnou licencí. AGPL navíc řeší situaci, kdy software běží na serveru a uživatel k němu přistupuje po síti – i tehdy vzniká povinnost zpřístupnit zdrojový kód.
Odhadujte analytiku dvakrát: nejdřív hrubě, pak těsně před prac
Pro přechod existujícího projektu nezačínejte přepisem všeho. Zapněte TypeScript v režimu, kdy se soubory s příponou .ts kontrolují, a soubory .js nechte být. Postupně přejmenujte ty, které upravujete, a přidejte typy jen na jejich rozhraní. Nástroje jako kontrolor typů spustíte nad celým projektem i bez překladu, takže získáte přehled o chybách, aniž byste cokoli měnili. Když se počet chyb ustálí, zvyšte přísnost. Tímto tempem se vyhnete týdnům, kdy projekt nejde sestavit a nikdo neví, která část je hotová.
Čistý kód v JavaScriptu neznamená, že je krátký. Znamená, že ho po vás někdo jiný – nebo vy za půl roku – přečte bez bolesti. JavaScript je flexibilní jazyk, a právě proto v něm snadno vzniká nepořádek. Základem je omezit počet cest, kterými se dá stejná věc udělat. Nepoužívejte mix var, let a const podle nálady. Držte se const všude, kde se hodnota nemění, a let jen tam, kde skutečně měnit potřebujete. var dnes nemá v novém kódu co dělat, protože jeho function scope a hoisting působí chyby, které se těžko hledají.
Praktický postup je jednoduchý. Nejdřív napište unit testy pro novou logiku. Potom přidejte integrační test pro každé nové propojení, které může selhat. A e2e test doplňte jen tam, kde by chyba znamenala, že uživatel nemůže dokončit klíčovou činnost. Poměr se bude lišit podle typu projektu, ale základna má vždy převažovat. U knihovny může být poměr výrazně ve prospěch unit testů, u aplikace s mnoha rozhraními se integrační vrstva rozroste.
Nad nimi stojí integrační testy. Ověřují spolupráci dvou až tří komponent: například že se data správně uloží a načtou, že se zpráva odešle do fronty, že se zavolá rozhraní. Tyto testy už mohou používat reálnou databázi nebo její lehkou náhradu. Nepoužívejte je ale jako náhradu za unit testy. Typická chyba je, že tým přesune veškerou logiku do integračních testů, protože se snáze píší. Výsledkem je pomalá sada, která padá z nesouvisejících důvodů a nikdo jí nevěří.
Kde končí rozumná hranice Vrchol pyramidy tvoří end-to-end testy. Procházejí celou aplikaci z pohledu uživatele a mají největší hodnotu při ověřování kritických cest: přihlášení, dokončení objednávky, odeslání formuláře. Zásadní je držet jejich počet nízký. Každý e2e test je pomalý, křehký a jeho selhání často neukazuje na chybu v logice, ale na změnu v rozhraní nebo v datech. Pokud jich máte desítky, brzy strávíte více času jejich opravami než vývojem.
Testovací pyramida není dogma, ale poměr, který udržuje zpětnou vazbu rychlou a levnou. Základ tvoří unit testy: měly by pokrývat izolovanou logiku, hraniční hodnoty a chybové stavy. Držte je v řádu milisekund, bez sítě, bez souborového systému a bez databáze. Když unit test potřebuje kontejner nebo běžící server, není to unit test. Čím více jich je, tím častěji můžete spouštět celou sadu při každé změně.
Vyhněte se dvěma častým omylům. Prvním je snaha mít „test na všechno" a měřit kvalitu procentem pokrytí. Pokrytí říká, co je spuštěno, ne co je ověřeno. Druhým je ignorování rychlosti. Test, který běží deset minut, vývojáři přestanou pouštět. Rozdělte sadu na rychlou, která běží při každém commitu, a pomalou, která se spouští před vydáním. Každý test musí mít jasný důvod, proč existuje. Když ho neumíte pojmenovat, pravděpodobně jen zdržuje.