SmartTester is a testing framework, intended for unit and component testing of SmartCGMS system developed in NTIS department of West Bohemian University in Pilsen. It is developed as Bachelor's thesis.
Je třeba začlenit funkční testovací filtr do celé aplikace.
Ve vstupním bodě nějak zvolit jednotkové testování filtrů a následně vytvořit jeho instanci.
Odhadovaná časová náročnost [h]: 5h
** Výsledná časová náročnost [h]: 10**
Otevření a zprovoznění projektu v IDE (CLion / VS). Ověření spustitelnosti z vývojového prostředí.
Odhadovaná časová náročnost [h]: 1 Výsledná časová náročnost [h]:
Je třeba začít s implementování regresního testování. Proto je nutné vytvořit zatím jednoduchou implementaci třídy RegressionTester a zajistit načtení konfigurace z konfiguračního souboru pomocí vhodných knihoven systému SmartCGMS.
Odhadovaná časová náročnost [h]: 10 Výsledná časová náročnost [h]: 10
Je třeba implementovat spuštění veškerých testů pokud nebude zadáno GUID. (metoda executeAllTests() třídy UnitTestExecutor. Výsledná časová náročnost [h]: 0.5
V metodě executeFilterTests(GUID& guid) třídy UnitTestExecutor je třeba implementovat vytvoření instance správné odvozené třídy podle zadaného GUID. Výsledná časová náročnost [h]: 2
V GenericUnitTesteru potřebujeme vytvářet IDevice_Eventy, které posíláme do filtrů. Tyto eventy se vytváří pomocí exportovaných symbolů z knihovny scgms, kterou musíme načítat.
Musíme tedy buď přidat další instanci CDynamic_Library jako atribut, nebo, lépe, po načtení filtru první knihovnu zavřít a otevřít druhou. Výsledná časová náročnost [h]: 0.5
V metodě loadScgmsLibrary() třídy GenericUnitTester se správně nainicializuje instance třídy CDynamic_Library a uloží se do atributu scgmsLib. Tímto atributem je v této metodě správně nahrána knihovna scgms pomocí metody Load().
Když je načtená knihovna volána v testu infoEventTest(), ukazatel na naštenou knihovnu je nullptr a nelze s ní pracovat.
Abychom mohli dodělaj ještě pár generickách unit testů, bylo by dobré implementovat funkci TestFilteru takovou, že zkontroluje, jaký event mu přišel jako parametr do metody Execute a podle toho vrátí odpovídající hodnotu.
Bylo by tak možné testovat "komplexnější" generické scénáře.
Odhadovaná časová náročnost [h]: 1 Výsledná časová náročnost [h]: 1
V konstruktoru třídy FileTesterMapper dochází k erroru při přiřazení std::bind do std::function z neznámého důvodu. Je třeba prokonzultovat s p. Úblem.
Je třeba začít se zapracováním konfiguračních testů do aplikace. Pro detailnější info viz. email od p. Úbla.
Odhadovaná časová náročnost [h]: 5 Výsledná časová náročnost [h]: 10
Pokusíme se vytvořit aspoň nějaký jednoduchý model, jak by mohla výsledná aplikace vypadat. Od p. Úbla jsme dostaci celkem dost informací, tak si myslím, že bychom se mohli trochu pohnout z místa.
Odhadovaná časová náročnost [h]: 3 Výsledná časová náročnost [h]: 2
Nesplněno ve 4. týdnu (17. 3. - 23. 3.), přesunuto na další týden.
Cílem je vytvořit vstupní bod naší testovací aplikace (třídu Main) a v ní úspěšně připojit požadované dynamické knihovny.
Odhadovaná časová náročnost [h]: 5 Výsledná časová náročnost [h]: 8
Je třeba udělat vhodné úpravy v aplikaci, aby byla kompatibilní s novým API testovaného SmartSCMG.
V rámci přechodu na nové API bude refactorována třída ReggressionTester.
každý model má buď příznak scgms::NModel_Flags::Discrete_Model nebo Signal_Model
pokud má model příznak (v deskriptoru) Discrete_Model, měl by jít vytvořit funkcí do_create_discrete_model
analogicky pokud tento příznak nemá, nesmí jít vytvořit
diskrétní modely:
nesmí jít vytvořit, pokud je na vstupu do_create_discrete_model vektor parametrů jinak velký, než je v deskriptoru (number_of_parameters)
jejich metoda Initialize musí jít volat právě jednou na začátku (opakované volání vrací chybu)
metoda Step musí jít volat s parametrem time_advance_delta == 0.0 (pak by měl model posílat dál současný stav) nebo větší (pak model může a nemusí něco poslat)
navíc implementuje scgms::IDiscrete_Model
Initialize - nastavuje počáteční stav, current_time je platná double hodnota, segment_id je jakékoliv číslo
Initialize - lze ho volat právě jednou, jakékoliv další volání musí vrátit E_ILLEGAL_STATE_CHANGE
Step - nesmí být volán dříve, než je zavolána metoda Initialize
Step - parametr musí být >= 0.0 (je to "rat time")
Step - pokud je parametr 0.0, emituje na výstupu současný stav (vždy)
Step - pokud je parametr >0, emituje na výstupu stav v čase o tolik dál
Discrete model ale reálně musí být vytvořen v rámci nějakého filtru, my na to máme "Signal generator" filtr
Funkčnost testujte např. s "Bergman extended minimal model" (bergman.dll):
synchronize to signal
synchronizace probíhá tak, že modelu se zavolá Step metoda podle Steppingu tak, aby "dohnal" signál, na který je synchronizovaný
např. mám vyplněný Stepping = 5min, jdou synchronzační signály v čase 1, 6, 7, 11, model je krokován na čas 0 (když přijde t=1), 5 (když přijde t=6), 10 (když přijde t=11)
pokud model není synchronizován, bude krokován maximálně do času uvedeného v Maximum time (od první hodnoty)
Shutdown_after_last - pokud model není synchronizován, tak po ukončení generování (maximum time) musí poslat shutdown
echo default parameters as event - pokud je zaškrtnuto, filtr jako první věc vyplivne parametry, které má nastavené v poli Parameters jako Parameters event
Je třeba vytvořit krátkou prezentaci na páteční předášku, kde budeme prezentovat odvedenou práci na projektu.
Odhadovaná časová náročnost [h]: 1 Výsledná časová náročnost [h]: 1
Je třeba vytvořit test, kterým by měl projít každý filtr a který by se měl reálně spouštět nad všemi filtry. Vytvoříme například "info" event, pošleme ho a budeme ho očekávat na výstupu. "Info" eventy filtr nesmí pořzat, stejně tak jako "warning" a "error" eventy.
Jelikož jde o test, který by měl testovat každý filtr, dá se uvažovat o abstraktní třídě/metodě. - prokonzultovat Výsledná časová náročnost [h]: 2
Je potřeba vybrat a zprovoznit vhodný kompilátor, abychom se mohliu dále posunout v implementaci aplikace. Ideálně najít poslední opravenou verzi MinGW, nebo zprovoznit MSVC a jeho debugging ve Visual Studiu.
Pro všechny jednotkové testy je třeba nastavit dobu, za kterou musí být test splněn, jinak bude vyhodnocen jako nesplněn. Reálně by měl být každý test splněn za několik milisekund, pro nás stačí defaultně nastavit např. 1 sekundu. Toto nastavení by mělo být snadno upravitelné, např. formou konstanty v kódu. Výsledná časová náročnost [h]: 0.5
Je třeba přepracovat vykonávání jednotkových testů.
Každý test bude spuštěn ve vlastním vlákně. Viz. diagram tříd na Gapps.
Odhadovaná časová náročnost [h]: 3 Výsledná časová náročnost [h]: 6
Je třeba poslat mail PhD. Úblovi, ohledně upřesnění dalších věcí a rekapitulace toho, co už víme. Výsledná časová náročnost [h]: 1
E-maily jsem přeposlal na studentské e-maily.
Vzhledem k tomu, že jsme dostali informace o tom, jak by měl náš testovací filtr vypadat a další informace jsou dostupné v souborech, které nám p. Úbl poslal, mohli bychom se pokusit o vytvoření aspoň jednoduchého filtru s nějakou jednoduchou funkcionalitou.
Odhadovaná časová náročnost [h]: 4
Je třeba dotáhnout požadavky specifikace a hrubý odhad práce do finální podoby, dát odsouhlasit zadavateli a odevzdat.
Odhadovaná časová náročnost [h]: 3 Výsledná časová náročnost [h]: 4
Najít vhodnou knihovnu pro logování v jazyce C++ a následně otestovat její použití.
Odhadovaná časová náročnost [h]: 2 Výsledná časová náročnost [h]: 2
Je třeba sepsat dokument objektové analýzy, který se v úterý odevzdává. Bylo by tedy vhodné se sejít a probrat výslednou podobu aplikace. Výsledná časová náročnost [h]: 4
filtr, signál, aproximátor i metrika by měly jít příslušnou funkcí vytvořit
žádná knihovna nesmí vytvořit entitu, kterou neobsahuje v deskriptoru (pro případ kdy např. zapomeneme else blok nebo tak něco - testovat se to dá s náhodným nebo neplatným GUID na vstupu)
do_get_descriptors, do_create a do_solve.. funkce obecně validují všechny vstupy (že nejsou nullptr, u deskriptorů že begin != end, apod.)
Unit testy spadnou na neoprávněnm zásahu do paměti, když se snažíme poslat event chainem. Je to způsobené tím, že se implicitně zavolá destruktor nad CDynamic_Library, když vrátíme instanci GenericUnitTesteru pomocí return. Výsledná časová náročnost [h]: 1
Pro testování ve vláknech potřebujeme předávat ukazatele na funkce, které provádí testování. Tyto funkce chceme mít jako členské. Předávat bychom je ale potřebovali jako ukazatele na klasické funkce, protože se pak jinak nedají zavolat a neznáme členské funkce v budoucích odvozených třídách.
Proto potřebujeme vyřešit, jak předat ukazatele na členské funkce jako ukazatele na normální funkce, nebo přijít s náhradním řešením.
Viz poslední commit ve feature-unit_testy. (4031e39)
Vstupní parametr pro jednotkové testování chceme změnit názvu logu na GUID logu. Jako parametry příkazové řádky budou tedy pro jednotkové testování zadány parametry ve tvaru např.: -u C0E942B9-3928-4B81-9B43-A347668200BA pro otestování log filtru. Je proto třeba změnit logiku zpracovávání vstupního parametru a přepsat pomocný výpis v metodě print_help().
Očekávaná časová náročnost [h]: 2