úterý 16. března 2010

Testování migrace dat

V posledních dnech jsme úspěšně spustili dlouho vyvíjený projekt a mám konečně čas něco napsat. Tématem dnešního příspěvku je testování migrace dat při přechodu na novou verzi nějaké aplikace.

Jako první věc je potřebné si uvědomit, co všechno obnáší migrace dat.
Obvykle se tím rozumí převod dat ve formátu "staré aplikace" do formátu dat "nové aplikace":

  • načtení vstupních dat a jejich validace
  • úprava a transformace dat do výstupního formátu podle pravidel migrace
  • uložení transformovaných dat na správné místo pro novou aplikaci



Testování by mělo ideálně probíhat v těchto fázích:

1. Test kvality vstupních dat
"Stará data" nemusí nutně být konzistentní (a prakticky málokdy jsou) - za dobu života aplikace mohly být třeba dělány do databáze "manuální zásahy", které obcházely "business rules". Pokud namigrujete takto "znečistěná" data, můžete se dostat později do zbytečných problémů. V této fázi testů byste měli identifikovat:

  • "typové sady" vstupních dat, které se budou migrovat
  • záznamy nebo obecně část dat, která se migrovat nebude (třeba úplná historie zakázek atd.)

Testy by měly být zaměřeny na validnost všech migrovaných atributů vstupních dat a kompletnost těchto dat + že migrační skript vyloučí nevalidní nebo nemigrované záznamy (migrační skript by měl obecně detailně logovat průběh kvůli dohledávání chyb a monitorování průběhu migrace):

2. Test migrační transformace
Většinou je potřebné převádět nějaké hodnoty na jiný formát, nebo ukládat data do jiné struktury. Veškeré tyto změny by měly být popsány v dokumentaci a dokonale otestovány (včetně "nevalidních" hodnot, pokud jste tyto nevalidní záznamy nevyloučili z migrace již v 1.fázi).
Kromě toho, že se hodnoty správně transformují na nový tvar, je potřebné si ověřit, že se i uloží na správné místo - často se stává, že hodnota je sice správně, ale migrace ukládá pole do sloupce X v databázi, ale aplikace tuto hodnotu očekává ve slouci Y (důsledek častého psaní dokumentace během vývoje a nedostatečné komunikace migračního týmu a týmu co vyvíjí novou aplikaci).

Doporučený postup:

  • nejdřív se udělá "rychlá kontrola" - počty namigrovaných záznamů v nových strukturách versus počty původních záznamů ve vstupních datech (ovšem při zohlednění pravidel migrace, třeba vypouštění historických záznamů)
  • následně se alespoň na vybraných typových datech ověří správnost transformace a uložení hodnot jednotlivých entit na správná místa, včetně jejich provázání například v databázových tabulkách


3. Regresní testy funkčnosti na zmigrovaných datech
Tato fáze může velmi pomoci buďto odhalit "přehlédnuté" chyby ve fázi 2, nebo designové chyby/porušení business pravidel (třeba když se hodnota 1 sice správně transformuje na hodnotu "Ano", ale zapomnělo se, že nová aplikace načítává tuto hodnotu pořád do proměnné typu Integer).

4. Testy aplikace na nových datech
Tyto testy by měly být součástí normálního vývoje nové verze dané aplikace, nicméně pro migrační testy je podstatné nějak do databáze dostat k migrovaným záznamům i "nově vytvořena data" pro další fázi - je výhodné použít data z testů samotné aplikace.

5. Porovnání namigrovaných dat s nově vytvořenými v aplikaci
Kouknutím na jednotlivé záznamy můžete zjistit, jestli nová a namigrovaná data vypadají buď v aplikaci nebo na "nižší úrovni" - třeba v databázi - "přibližně stejně".
Nejde jenom o cíl "datové čistoty" - třeba se mi stalo, že migrace do pole parametrů namigrovala názvy parametrů A,B,C a nově vytvořený záznam měl tyto názvy X,Y,Z. Modifikace nad těmito záznamy samozřejmě selhala, jelikož aplikace očekávala jiné názvy parametrů.
Prakticky to kontroluji v databázi výběrem pár řádků s namigrovanými záznamy + pár řádků s novými záznamy a vizuální kontrolou. Už se mi tak podařilo odhalit pár velmi nepříjemných chyb, které unikly testerům v předešlých fázích.

Osvědčil se vám nějaký jiný způsob testování migrace, o který byste se rádi podělili? Vyjádřete se v diskuzi :-)

4 komentáře:

  1. Při kontrole údajů v nové struktuře je poměrně výhodné vyrobit nějaké kontrolní součty. Často se stane, že počet záznamů odpovídá nebo se nedá přesně porovnat, protože se mění struktura (vznikají nové tabulky apod.) Kontrolní součty by měly ověřovat ty data se kterými se dělaly nějaké operace a ověřovat "funkčnost" tzn. nejde pouze o to, že se sečtou nějaké hodnoty v jedné tabulce, ale např. stáří klientů s vybraným produktem apod.

    OdpovědětVymazat
  2. Ahoj,
    Při testech migrace si opomenul jedno zásadní pravidlo.

    tj. nezničit testovací prostředí:

    Migrace se testuje vždy ve více fází:
    Nejprve se zkusí migrace jednoho jednoduchého a jednoho nejsložitějšího data.

    Tyto první data musí být vybrány, tak aby vždy šli vytvořit v systému i po migraci znovu.

    Po migraci se udělá přesná kontrola 1:1 dat = před migrací, migrovaných a nových - kontrola musí obsahovat 100% všechny parametry, které se migrují 1:1. Potom se spustí kontrolní script nad jen migrovaném datu, který musí kontrolovat nové položky, které vznikají při migraci ( nové úrově a pod ). Pokud toto projde můžeš postupovat jak popisuješ v dokumentu.

    Jelikož migrace může obsahovat nalití i do stávajicích tabulek, nejen na nové nebo se ti data mohou dostat i do tabulek, kde nemají být apod.

    Postup, který popisuješ lze jen v případě pokud migrace je na novou DB a prázdnou.( či ji můžeš smazat a vrátit). Jinak v ostatních případech hodně štěstí při rovnání dat.
    Tomáš Jandák

    OdpovědětVymazat
  3. Ahoj Tomáši, máš samozřejmě pravdu, děkuji za podnětný příspěvek.

    Upřímně řečeno jsem se doposud nesetkal s tím, že by se migrace dělala "na místě", vždy pro ni bylo vyhrazeno samostatné migrační prostředí (nezávislé od "běžného testovacího", jelikož to se paralelně využívalo i na testy jiných projektů) a veškerá data se transformovala stylem vytáhnu z databáze, transformuji, insertnu do nové databáze - vývojářům se pak lépe dohledávaly chyby.

    Martin

    OdpovědětVymazat
  4. Whаt's up, after reading this amazing article i am as well happy to share my know-how here with colleagues.

    Here is my webpage - unlock iphone 4

    OdpovědětVymazat