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