Testování SW pomocí dávkového souboru v příkazové řádce (okno "cmd")



Myšlenka testování je ta, že na stejný vstup by měl program dávat stejný (nejlépe správný) výstup.
Již při tvorbě/rozboru/návrhu programu si specifikujeme různé kombinace vstupů pro správné i špatné výstupy (například kombinace čísel z různých kategorií - malé, velké, kladné, záporné, nula ... a chybové stavy - místo čísla text, číslo ve špatném formátu, kladné na místě záporného ...).
Po vytvoření programu si vytvoříme typické vstupy pro správné i chybové/"špatné" výsledky/výstupy.
Program spustíme, výstup překontrolujeme a v případě, že je v pořádku, potom ho uložíme do souboru jako vzorový výstup.
Nyní tedy máme obrazy vzorových vstupů a příslušných vzorových výstupů.
Při změně kódu (v budoucnu) potom můžeme utvořit nové výstupy a porovnat s výstupy původními=vzorovými. V případě, že jsou stejné, můžeme konstatovat, že při změně kódu se chování programu nezměnilo.



Součásti testování

Pro testování se používá mechanizmus prostředí příkazové řádky k přesměrování vstupů/výstupů z/do souboru.
Pokud použijeme zápis: soubor.exe <keyb.txt, potom systém zajistí, že při průběhu programu soubor.exe bude systém číst data/znaky ze souboru keyb.txt a bude je posílat soubor.exe tak, že tento si bude myslet, že přichází z klávesnice. Dojde tedy k přesměrování vstupu - zdrojem bude soubor, ale program si bude "myslet", že data jsou zadávány z klávesnice.
Obdobně je možné použít zápis pro výstup: soubor.exe > vystup.txt. V tomto případě systém zajistí, že výstup nejde na standardní výstup/konzolu/monitor, ale ukládá se do souboru. Program si myslí, že píše na monitor, ale znaky se ukládají do souboru. Dochází k přesměrování z monitoru do souboru.
V jazyce C existují dva výstupy a to standardní a chybový. Pro jejich výstup lze použít fprintf(stdout, " text ", hodnoty) = printf a pro chybový výstup fprintf(stderr, "text ", hodnoty). Systém je dokáže odlišit: přesměrování pro standardní je buď > nebo 1>, pro chybový potom 2>.
Přesměrování vstupu i výstupu je možné provádět současně pro jedno spuštění programu program.exe < data.in >data.out 2>data.err.

Pro porovnávání aktuálních a vzorových výstupů je možné použít příkaz/program příkazové řádky fc (FileCompare). Jako parametry má dva soubory, které se porovnávají. Umí porovnávat v textové, nebo binární formě. Výstup, které zobrazuje případné odchylky je na konzolu (ale je možné ho přesměrovat do souboru). Návratová hodnota (return) tohoto programu je nula v případě, že jsou soubory stejné, nebo 1 v případě, že jsou odlišné. Vrácení jiné hodnoty znamená neurčenou chybu při provádění.
Návratovou hodnotu právě ukončeného programu uloží systém automaticky do proměnné ERRORLEVEL.

V našem případě se provádí testování testovaného souboru tak, že se do něj přesměruje obsah vstupního souboru (name.stdin) a jsou pořízeny dva výstupy (name.stdout a name.stderr). Tyto výstupy jsou pomocí programu fc porovnány se vzorovými výstupy v souborech (name.stdout.ref a name.stderr.ref).
Toto testování se spouští několikrát pro různé názvy testů (při voláních různých testů se liší jméno souboru, to je "name" v názvech souborů výše).

Pro řešení se používá prostředí příkazové řádky = shell (interpret příkazů), který se spouští příkazem cmd.exe. Je to textové prostředí, ve kterém je možné spouštět příkazy a skripty (=dávkové soubory, což jsou soubory s příkazy = program příkazové řádky). Spustitelné dávkové soubory jsou textové soubory a mají příponu cmd (dříve bat).
Testování je prováděno pomocí dávkových (cmd, bat) souborů. Tyto se provádí v textové konzole ("černé okno"). Pokud je spouštíme z prostředí windows (explorer), potom je vhodné na jejich konec dát příkaz pause, abychom viděli výsledek. Drohou možností je spustit v daném adresáři prostředí příkazové řádky pomocí příkazu cmd (cmd.exe). Potom můžeme volat cmd soubor (testuite_nsd.cmd) přímo jeho názvem. Výsledek zůstane na obrazovce, protože okno cmd se nyní nezavře po dokončení.
Toto je realizováno v souboru testsuite_nsd.cmd. Tento soubor je nutné napsat pro každý testovaný exe soubor.



Popis cmd souborů

testsuite_nsd.cmd

Využívá se volání (pomocí příkazu call) dalšího cmd souboru (s názvem testcase.cmd). Tomuto testování jsou jako parametry předány:
- název testovaného souboru (mainsd.exe)
- základ názvů vzorových souborů ("name" výše; zde delitel_04)
- požadovaná návratová hodnota (return X z main testovaného souboru, zde "1")
Pro další test se připraví vzorové testovací soubory a přidá se jeden řádek s voláním testcase
Soubor je nutné napsat/upravit pro testování každého programu znovu
Vzor volání: call ./testcase ./mainsd.exe delitel_04 1

Pozn.: řádek začínající REM značí poznámku - nevykonává se
Pozn.: příkaz ECHO nastavuje, zda se budou při vykonávání tisknout řádky (příkazy) z dávkového souboru (ON/OFF).
Výstupy spuštěných programů se tisknou vždy.
Pozn.: znak @ říká, že se má příkaz uplatnit již na tomto řádku. Jinak jeho platnost začíná až na dalším.
Pozn.: ./ znamená aktuální adresář



Testcase.cmd

Vlastní testování je v souboru testcase, který je univerzální a není ho nutné měnit - všechny parametry, které se mění jsou mu dodány jako parametry při volání.
Soubor testcase se skládá z několika částí, které postupně provedou:
- kontrola dodání vstupních parametrů
- kontrola existence testovaného souboru
- kontrola existence vstupního testovacího a vzorových výstupních souborů
- spuštění programu a vytvoření aktuálních výstupů do souborů a výstupní hodnoty do proměnné
- test správnosti výstupní hodnoty
- otestování přítomnosti chybového výstupního souboru
- otestování "stejnosti" chobového výstupního souboru se vzorovým
- otestování přítomnosti standardního výstupního souboru
- otestování "stejnosti" standardního výstupního souboru se vzorovým

Poznámky:
- do proměnné ERRORLEVEL se ukládá výstupní/návratová hodnota spuštěného programu
- %~1 tento zápis se vztahuje k parametrům dávkového souboru (zde se jedná o použití prvního předaného parametru, při přiřazení se odeberou uvozovky). %0 je nultý parametr. %* jsou všechny parametry.
- příkaz SET slouží k nastavení proměnných. S přepínačem /A umí i operace: set /A x=2+3.
- znaky % slouží ke "čtení" proměnné (tj. použití její hodnoty) %promenna%
- znaky ! slouží ke "zpoždění" vyčíslení proměnné, které se používá převážně v podmínkách. (při % % se proměnná vyčíslí před provedením příkazu (aktuální hodnota se vezme při parsování, přitom se v některých situacích parsují velké části kódu kdy může dojít, při následném spuštění, ke změně proměnné ale bude používána stále hodnota původní), zatímco u ! ! se hodnota získá až během provádění, tj. hodnota proměnné se vyčíslí až v okamžiku, kdy je potřeba). Musí být nastaveno Setlocal EnableDelayedExpansion. Například příkaz for se nejdříve "připraví" jako celek (včetně těla cyklu) a pak se provádí. Použijeme-li proměnnou % %, použije se při každém cyklu hodnota proměnné v době "přípravy" (parsing time). Při použití ! ! se bude používat aktuální hodnota - získání hodnoty bude "posunuto" (delayed) až na dobu, kdy budeme s proměnnou pracovat.







„Minimální“ verze v jednom souboru bez ošetření (neexistující soubory, proměnné, ...)

echo OFF
cls

REM nazev testovaného souboru, základ názvu testovacího a vzorových výstupních souborů
REM navratova hodnota programu,
call:TestFunc soub_01 1
call:TestFunc soub_02 1

goto end

REM funkce pro test jednoho pripadu
:TestFunc
REM zjisteni vysledku na zaklade vstupu
testprog.exe < %~1.in >%~1.out

REM test navratove hodnoty testovaného programu
if NOT %ERRORLEVEL% == %~2 echo Chybny return code %~1 %~2 je %ERRORLEVEL%

REM test shody vystupních hodnot se vzorem
fc %~1.out %~1.res >x
if NOT %ERRORLEVEL%==0 echo Chybny vystup %~1

goto:eof

:end

echo on

pause















Poslední změna 2017-02-09