Search
Cílem úlohy je vyzkoušet si otestování stavového automatu uvnitř (téměř) reálné aplikace.
Vaše semestrální práce se bude zabývat jedním z následujících automatů ve webové aplikaci (viz níže):
Poznámky:
Navrhněte testovací sadu pro konečný automat z aplikace (viz výše; u aplikace za výstupní symboly považujte název přechodu plus název cílového stavu přechodu) a z umělých automatů (dle čísla vaší skupiny; zadání, ZIP s CSV a diagramy, řešení úloh 40 až 50).
Testy musí zajistit, že případné skryté stavy ve vzdálenosti jednoho kroku budou odhaleny (k=1). Samozřejmě, navrhněte i příslušnou charakterizační množinu. Nedosažitelné části automatu identifikujte jako chybu. Jestliže přechod z nějakého stavu není pro danou událost určen, zůstává automat ve stejném stavu a na výstup pošle předdefinovaný výstupní symbol (default output).
Zpráva řešení bude obsahovat:
Řešení úlohy bude provedeno pomocí vámi napsaného algoritmu (v libovolném programovacím jazyce). Smíte používat libovolné knihovny pro obsluhu vstupu, výstupu i reprezentace grafu, samotný algoritmus však musí být napsán vámi. Relevantní část zdrojového kódu vašeho programu vložíte do zprávy (jako přílohu na konec; doporučuji relevantní zdrojový kód vyčlenit do samostatného souboru a ten vložit celý), ve zprávě se pak na přílohu a odpovídající funkci/metodu odkážete.
Váš program spustíte na dva vstupy (zpráva tedy bude mít dvě velmi podobné části). Prvním je umělý automat (viz 1. odstavec), druhým je automat získaný z aplikace pro vaši semestrální úlohu.
Doporučujeme zprávu generovat vaším programem. Proto můžete odevzdávat zprávu i v HTML. Nebo můžete použít libovolný jiný formát, například LuaTeX či Markdown, a exportovat výsledek do PDF (viz Pandoc).
Zadání - 1. varianta: Vytvořte generátor testů pro Selenium. Vstupem je aplikace pro semestrální úlohu (přesněji stavový automat z ní získaný). Výstupem je vygenerovaný test, který po spuštění v Seleniu aplikaci prokliká a projde tak pokud možno všechny stavy i hrany automatu. Důraz je kladen hlavně na integraci Selenia, vazby mezi odkazy a přechody automatu.
Zadání - 2. varianta: Vytvořte generátor testů, podobný 1. variantě zadání, avšak bez interakce se Seleniem. Testy budou přímo vyvolávat přechody automatu, tak aby pokryl stavy i přechody. Důraz je kladen na generování testovacích dat (vhodné hodnoty parametrů přechodů, výchozí stav databáze, obnovení databáze pro další běh, atd.) a sestavení vhodných posloupností přechodů (pokrytí grafu). Splnění úlohy může spočívat například v návrhu vhodného DSL (realizovaný nejlépe v JSON) pro reprezentaci generovaných testů a vytvoření interpretu, který testy provede. Komplikací je zde nedeterminističnost automatu, kdy testující program neví, do jakého z možných stavů nedeterministický přechod povede. Testující program tedy musí reagovat na skutečné chování automatu.
Zadání - n. varianta: Jak jinak by se takovéto automaty daly testovat? Jaké nástroje k tomu existují? Jak je lze použít?
Poznámky ke všem variantám:
Jako základ pro export automatu z aplikace můžete použít následující PHP skript:
<?php list($context, $core_cfg) = require './core/init.php'; // inicializace frameworku $machine = $context->smalldb->getMachine('article'); // získání instance automatu $states = $machine->describeAllMachineStates(); // popis stavů automatu $actions = $machine->describeAllMachineActions(); // popis přechodů automatu var_dump($states); var_dump($actions);
Poznámka: Implementace automatu rozlišuje mezi “akcí” a “přechodem”. Akce je skupina stejnojmených přechodů v automatu, která může sdílet část konfigurace. Samotné přechody automatu jsou pod klíčem “transitions” v konfiguraci akce, kde klíčem je výchozí stav a v “targets” jsou možné cílové stavy přechodu. “Akci” lze tedy chápat jako vstupní symbol. Podrobnější popis naleznete v plugin/smalldb/class/StateMachine/AbstractMachine.php.
plugin/smalldb/class/StateMachine/AbstractMachine.php
Dokumentaci i demo frameworku, na kterém je aplikace postavena, najdete na cascade.frozen-doe.net a smalldb.org (aplikace stojí na postarší verzi knihoven, to podstatné se však nijak výrazně neměnilo; pro bonusovou úlohu doporučuji použít aktuální verzi).