Segítség
Mind az ural2-n, mind a cportán a tesztek valamilyen szinten (ál)véletlen sorozatok. Hibát keresni pedig csak azonos bemenettel lehet (érdemes). Ezért lopjunk el egy mintát a hftest-től, és azzal teszteljünk. A következőkben a 6. hftest feladat ural2-n való teszteléséhez kívánok ötleteket adni, de a módszer más feladatokra is használható.
- Lopjunk el egy mintát a hftest-től: Ennek legegyszerűbb módja, hogy a standard hibakimenetre (stderr) kiírjuk, amit kapunk a standard bemeneten. Ezt megtehetjük mivel a hftest csak a standard inputot és az outputot veszi magához. Ezért
- módosítsuk a programot úgy, hogy minden beolvasás után azonnal írjunk is ki pl:
while((c=getchar())!=EOF) { fputc(c, stderr); .....
- Ezután futtassuk a programot a hftest-tel és irányítsuk a standard hibakimentet egy fájlba:
hfest myporg 2> teszt-minta
A parancs hatására a teszt-minta nevű fájlba kerül minden, amit programunk a standard hibakimenetre írt.
- módosítsuk a programot úgy, hogy minden beolvasás után azonnal írjunk is ki pl:
- A kapott mintában keressük meg azokat a sorokat, amelyek illeszkednek a feladat reguláris kifejezésére. Ezt legegyszerűbben az
egrep
programmal tehetjük meg. Írjuk a megtalált sorokat a jo-minta nevű fájlba!egrep 'feladatban_adott_reg_kifejezes' teszt-minta > jo-minta
- keressük meg azokat a sorokat, amelyek nem illeszkednek a feladat reguláris kifejezésére. Írjuk a megtalált sorokat a rossz-minta nevű fájlba!
egrep -v 'feladatban_adott_reg_kifejezes' teszt-minta > rossz-minta
- Számoljuk meg melyik fájlban hány sor van:
wc -l teszt-minta jo-minta rossz-minta
- Nézzük meg, hogy a mi programunk a mintákra hogyan viselkedik: (ne felejtsük kivenni a programba tett kiírásokat (fputc()), és célszerű a végeredményt kiíró formátumban az oktális formátumot decimálisra állítani.
./myprog < teszt-minta ./myprog < jo-minta ./myprog < rossz-minta
- Célszerű tovább szűkíteni az esetek számát, ezért a mintákból ki kell választani egy sort, amire rosszul viselkedik a program.
Tegyük fel, hogy a probléma az, hogy bizonyos mintákat nem ismer fel. Ekkor a jo-minta fájlból kell egy sort kiválasztani. Tegyük fel, hogy nincs szerencsénk, és az első pár mintát jól ismeri fel, csak később van valami gubanc. Ezért kezdjünk tesztelni a következő paranccsal úgy, hogy i értékét folyamatosan növeljüki=1; head -$i jo-minta | tail -1 | ./myprog
- Ha megtaláltuk a rendetlenkedő mintánkat, akkor debugger-rel, vagy mezei kiírásokkal szűkíthetjük tovább a hibát.
- Az állapotgép állapotainak tesztelésére hatékony módszer lehet, hogy minden beolvasott karaktert kiírunk és az állapotgép új állapotát is. Gyakran azonban könnyebb a változtatás előtti állapotot kiírni pl. így:
while((c=getchar())!=EOF) { printf("%c%d ", c, allapot); if (ch == '\n') lines++; switch (allapot) { .....
Az így módosított programot a kritikus sorra futtatva könnyen behatárolható a hiba. Tegyük fel, hogy a 6. sorban levő minta a kritikus és az i=6; head -$i jo-minta | tail -1 | ./myprog parancsra az alábbi kimentett kaptuk:
'0 _5 ,0 _5 +0 _5 +0 _5 .0 _5 &0
Ebből azt látjuk, hogy az állapotgép 0. állapotában jött egy aposztróf (
'
). Ennek hatására 5. állapotba kerültünk, amikor jött egy aláhúzás (_
), aminek hatására újból 0. állapotba kerültünk, és ott is maradtunk egészen végig, bármi is jött.