Automatické testování

Z Freenetis Wiki
Přejít na: navigace, hledání


Automatické testování slouží jako zpětná kontrola provedených akcí vývojáře.

Architektura testů

Testy jsou zcela automatizované (programátor nemusí testy programovat, ale jen dodávat data k jejich testovaní) a automaticky přizpůsobitelně změnám ve zdrojových kódech.

Testy umožňují kontrolovat modely, helpery a controllery, ostatní části systému jsou kontrolovány pouze na jejich syntaktickou správnost.

Testy oproti unit testům neporovnávají výsledné hodnoty daných funkcí ale pouze ověřují zda-li neskončil běh chybou.

Testy jsou podporovány na *unix operačních systémech.

Načtení informací o zdrojových kódech

Načtení informací o zdrojových kódech probíhá automaticky pomocí skriptu, který prochází všechny testované subjekty a získává z nich data nutná k volání rutin subjektů. Tyto data jsou ukládána do XML dokumentu (/application/vendors/unit_tester/unit_testing_config.xml).

Instalace testů

Instalace potřebných knihoven:

v Ubuntu/Debianu:

sudo apt-get install curl perl libxml-writer-perl libxml-dom-perl

ve Fedoře:

sudo yum install curl perl perl-XML-Writer perl-XML-DOM php-xml

Přidělení práv:

cd /var/www/freenetis
chmod +x ./application/vendors/unit_tester/tester.sh

Zamezení posílání e-mailů/SMS apod.:

Do config.php přidejte:

$config['unit_tester'] = TRUE;

Spuštění testů

Upozornění: Testy spouštějte pouze na lokálním vývojovém serveru!

cd /var/www/freenetis/application/vendors/unit_tester
./tester.sh <URL> <LOGIN_NAME> <PASSWORD>

poznámka: Doba běhu všech testů na Intel Core i5 2.53GHz s Ubuntu 11.04 je cca 4 minuty.

Příklad s argumenty:

./tester.sh -o http://localhost/freenetis admin 123456

Argumenty testovacího skriptu

$ ./tester.sh --help
Script for testing FreenetIS
USAGE: tester.sh [options] URL username password

Options:
 -o, --open-browser     Opens browser with models or helpers errors
                        automatically, after error detection.
 -s, --skip-syntax      Skip syntax check of all files
 -m, --skip-models      Skip test of models
 -h, --skip-helpers     Skip test of helpers
 -c, --skip-controllers Skip test of controllers
 -e, --enable-stats	  Turn on statistics and benchmarks

Úprava testovaných informací

Automaticky vygenerované testovací hodnoty nejsou pro testování dostatečné, proto je vhodné doplnit některé další hodnoty.

Postupy uvedeme na příkladu modelu, v konfiguračním souboru nalezněte příslušný subjekt (dle názvu tagu a atributu jména).

Model po automatickém vygenerování:

<model name="test">
    <method name="testovaci_funkce" autogenerate="on">
        <attributes>
            <attribute name="user_id" default_value="" />
            <attribute name="filter_values" default_value="array()" />
        </attributes>
        <values>
            <input>
                <param value="" />
                <param value="array()" />
            </input>
        </values>
    </method>
</model>

Velmi důležitý je atribut metody autogenerate, pokud provedete změny v metodě a nenastavíte jej na hodnotu off změny se při spuštění testování zahodí.

Tag input lze chápat jako jednu sadu testovaných hodnot dané metody.

Pokud si nepřejete aby metoda byla testována vůbec (časté u metod, které jsou závislé na objektech, nebo vkládají data do databáze), lze toho docílit takto:

<model name="test">
    <method name="testovaci_funkce" autogenerate="off">
        <attributes>
            <attribute name="user_id" default_value="" />
            <attribute name="filter_values" default_value="array()" />
        </attributes>
        <values>
        </values>
    </method>
</model>

Ideální testovací data (snažíme se vkládat i nesmyslné a prázné hodnoty) pro náš testovací model mohou vypadat takto:

<model name="test">
    <method name="testovaci_funkce" autogenerate="off">
        <attributes>
            <attribute name="user_id" default_value="" />
            <attribute name="filter_values" default_value="array()" />
        </attributes>
        <values>
            <input>
                <param value="" />
                <param value="" />
            </input>
            <input>
                <param value="" />
                <param value="array()" />
            </input>
            <input>
                <param value="1" />
                <param value="array('id' => '1')" />
            </input>
            <input>
                <param value="abd'se$#@`" />
                <param value="abd'se$#@`" />
            </input>
            <input>
                <param value="1" />
                <param value="array('id' => '1sef%se@š`', 'Ijnfsief' => 'se2', 'sef$a;!')" />
            </input>
        </values>
    </method>
</model>

Dodatečné vlastnosti pro controllery

Pro controllery lze posílat i data pomocí POST a GET HTTP akce, stačí do vstupního parametrů testu přidat parametry ve tvaru:

<param name="post_name" type="post" value="hodnota" />
<param name="get_name" type="get" value="hodnota" />

Po-editační testovaní validity dokumentu

Po každé editaci konfiguračního souboru je vhodné zkontrolovat jeho validitu pomocí dodaného DTD (/application/vendors/unit_tester/unit_testing_config.xml), jelikož samotný test počítá s validní konfigurací!

V IDE Netbeans kontrolu validity provedete pomocí označení konfiguračního souboru a následného vyvolání jeho kontextového menu a položky Validate XML.

Statistiky a benchmarky

Součástí testů jsou i nástroje pro benchmarky modelů a controllerů. Lze je zapnout pomocí parametru -e.

Výsledky benchmarků u modelů je zobrazováno ve výstupním HTML souboru společně s testy.

Výsledky u controllerů jsou ukládány do souboru curl/cstats, který má čtyři sloupce oddělené tabulátorem.

  • První slopec obsahuje informaci o době provádění controlleru v sekundách.
  • Druhý sloupec obsahuje spotřebu paměti v MB pro dané provádění.
  • Třetí sloupec je URL požadavku.
  • Čtvrtý obsahuje hodnoty HTTP POST odeslané controlleru.

Příklad výpsání 10 požadávků s největší spotřebou paměti:

cat curl/cstats | cut -f 1,2,3 | sort -n -r -k 2,2 | head -n 10



Poznámka: V celém návodu je uvažována cesta k FreenetISu odvozená z Instalace FreenetIS