Jak zvládnout verzování kódu při paralelních větvích

من كوبتيكبيديا

Základní pravidlo je jednoduché: pište jednotkové testy pro logiku, která má jasné vstupy a výstupy, a integrační testy pro kritické cesty, které propojují více vrstev. Typickou chybou je testovat všechno přes integrační testy, protože se zdá, že to lépe simuluje reálné použití. Výsledkem je ale pomalá testovací sada, která při změně jedné závislosti vyžaduje úpravy mnoha testů. Naopak jednostranné zaměření na jednotkové testy vede k tomu, že se přehlédnou problémy vzniklé při propojení modulů.

Jak na testování async akcí s thunk middleware Při testování thunků se často setkáte s potřebou mockovat API volání. Místo skutečného HTTP requestu použijte knihovnu pro mockování, jako je nock nebo msw. Tyto nástroje vám umožní definovat očekávané odpovědi a ověřit, že vaše akce správně zpracovává úspěch i chybu. Typický test vypadá takto: vytvoříte mock store, nastavíte očekávané API volání, zavoláte async akci a počkáte na její dokončení. Poté ověříte, že store dispatchoval správné akce (např. REQUEST, SUCCESS nebo FAILURE).

Pro asynchronní akce budete potřebovat simulovat store. Nejjednodušší je použít redux-mock-store, který vám umožní zachytit dispatchované akce. Vytvoříte mock store s inicializovaným stavem, zavoláte akci a poté zkontrolujete, jaké akce byly odeslány. Tento přístup funguje skvěle pro thunky, ale pozor na to, že mock store neprovádí reducery. Pokud potřebujete otestovat i změny stavu, musíte použít jiný přístup – buď vytvořit skutečný store s reducery, nebo použít kombinaci mock store a ručního volání reducerů.

Během importu sledujte logy na chyby. Typickou pastí jsou rozdílné formáty data a času, kdy MySQL umožňuje ukládat neplatné hodnoty, zatímco PostgreSQL je striktní. Pokud narazíte na chybu typu 'invalid input syntax for type timestamp', opravte zdrojová data ještě v MySQL nebo použijte dočasný sloupec s textovým typem. Po dokončení importu porovnejte počty řádků v každé tabulce mezi zdrojovou a cílovou databází. Nástroj pgloader umí generovat report, ale pro kritické tabulky si napište vlastní kontrolní dotaz.

Dalším aspektem je doba běhu. Pokud testy trvají déle než pár minut, vývojáři je přestanou spouštět před commitem. Proto rozdělte testy na rychlé (jednotkové) a pomalé (integrační). Rychlé testy spouštějte při každé změně, pomalé až v CI při sestavení pull requestu. Tím zajistíte, že vývojář dostane rychlou zpětnou vazbu, ale zároveň se ověří celková funkčnost systému.

Začněte u reducerů. Reducer je funkce, která přijímá stav a akci a vrací nový stav. Testování spočívá v tom, že zavoláte reducer s konkrétním stavem a akcí a porovnáte výsledek s očekávaným. Důležité je neměnit původní stav – reducer musí být čistý. Při psaní testů vždy vytvořte nový objekt stavu, abyste předešli vedlejším efektům. Typická chyba je testovat reducer přes celý store, což zbytečně komplikuje izolaci. Místo toho importujte reducer přímo a testujte ho jako samostatnou jednotku.

Při práci se soubory nebo databází často narazíte na problémy s čistotou prostředí. Vytvořte si fixture, která vytvoří dočasný adresář a po skončení testu ho smaže. Použijte k tomu modul tmp_path, který pytest nabízí zdarma. Nikdy nepoužívejte absolutní cesty k souborům, které existují jen na vašem počítači, jinak se testy nespustí nikde jinde. Stejně tak se vyhněte reálným síťovým voláním – místo toho si data připravte lokálně nebo použijte mock.

Důležité je nepřehánět mockování. Pokud mockujete každou závislost, testy se stanou křehkými a přestanou odrážet realitu. Na druhou stranu příliš mnoho integračních testů s reálnou infrastrukturou (databáze, fronty) zpomaluje lokální vývoj i CI pipeline. Najděte kompromis: pro běžné operace použijte in-memory varianty úložišť, ale pro kritické transakce nechte běžet test proti skutečné databázi (například v Dockeru). Tím získáte rychlost i věrohodnost.

Praktický postup: od exportu po ověření konzistence Pro samotný přenos dat použijte nástroj pgloader, který umí číst přímo z MySQL a zapisovat do PostgreSQL. Před spuštěním si připravte cílovou databázi s prázdným schématem – pgloader vytvoří tabulky automaticky, ale výsledné datové typy často nejsou optimální. Po importu proto zkontrolujte definice sloupců a upravte je ručně, zejména pokud jde o číselné typy (MySQL INT vs PostgreSQL INTEGER) nebo dekadická čísla. Pro velké tabulky zvažte rozdělení exportu na menší dávky, abyste předešli přetečení paměti serveru.

Posledním tipem je automatizace kontroly kvality. Pokud máte CI pipeline, která spouští testy na každé větvi, využijte ji. To vám dá rychlou zpětnou vazbu, ať už pracujete na čemkoli. Pokud ji nemáte, zkuste alespoň před každým pushnutím spustit lokální testy. Pracujte tak, abyste vždy věděli, které změny jsou v které větvi, a hlavně se nebáte větve mazat po dokončení funkce. Udržovat jich mnoho je kontraproduktivní a vede ke zmatkům.