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ó.

  1. 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.

  2. 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
    
  3. 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
    
  4. Számoljuk meg melyik fájlban hány sor van:
    wc -l teszt-minta jo-minta rossz-minta
  5. 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
    
  6. 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ük
       i=1; head -$i jo-minta | tail -1 | ./myprog
    
  7. Ha megtaláltuk a rendetlenkedő mintánkat, akkor debugger-rel, vagy mezei kiírásokkal szűkíthetjük tovább a hibát.
  8. 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.

Utolsó frissítés: 2016-02-09 14.13