Mýliť sa je ľudské
Dvanásta prednáška
Stiahnuť PDF · 2,5 MBPreber si túto poznámku so svojou AI
Skopíruj pripravený podklad a vlož ho do ChatGPT, Claude alebo inej AI — bude ťa učiť alebo skúšať len z tejto poznámky.
Náhľad poznámky
Mýliť sa je ľudské
Informatika 2
Cieľ prednášky
• chyby v softvéri
• vyhľadávanie a odstraňovanie chýb
• overovanie správnej funkcie softvéru
• príklad: projekt plánovací diár
Informatika 2
1
Projekt planovaciDiar
• diár v prvom semestri – zápis poznámok
• nový diár – plánovanie úloh v rámci týždňa
Informatika 2
2
Projekt planovaciDiar – zadanie
• udalosti – iba na pracovné dni
• pracovný čas od 9. hodiny do 17. hodiny
• začiatok udalosti – celá hodina
• trvanie udalosti – celé hodiny
Informatika 2
3
Projekt planovaciDiar – model
Informatika 2
4
Projekt planovaciDiar – trieda Udalost
Informatika 2
5
Projekt planovaciDiar – trieda Den
Informatika 2
6
Projekt planovaciDiar – trieda Tyzden
Informatika 2
7
Typy chýb
• syntaktické chyby
• behové chyby
• logické chyby
Informatika 2
8
Syntaktické chyby
• zistí a hlási prekladač
• nedodržanie formálnych pravidiel
programovacieho jazyka – syntax jazyka
• preklepy pri písaní zdrojového textu
• jasné chyby – na mieste kurzora
• nejasné chyby – nie na riadku s kurzorom
• !čítať texty chybových hlásení!
Informatika 2
9
Syntaktické chyby – príklad(1)
Informatika 2
10
Syntaktické chyby – príklad(2)
Informatika 2
11
Behové chyby
• zistí a „hlási“ procesor pri vykonávaní programu
• hlási = program „havaruje“
• procesor nemôže vykonať požadovaný príkaz
• delenie nulou, správa neexistujúcemu objektu...,
• zákernosť behových chýb
– nemusia sa prejaviť pri každom spustení programu
– „zavlečená“ – skutočná chyba je niekde skôr
Informatika 2
12
Behové chyby – príklad(1)
Informatika 2
13
Behové chyby – príklad(2)
Informatika 2
14
Logické chyby
• môže zistiť a „hlási“ používateľ programu
• program pracuje, ale jeho výsledky sú nesprávne
• najzákernejšie chyby
Informatika 2
15
Logické chyby – príklad(1)
Informatika 2
16
Logické chyby – príklad(2)
Informatika 2
17
Logické chyby – príklad(3)
Informatika 2
18
Techniky boja s chybami
• testovanie (testing)
• ladenie (debuging)
• písanie udržovateľného kódu
(maintainable code)
Informatika 2
19
Testovanie
• proces overovania správneho fungovania
programu
• testovanie fungovania celej aplikácie – aplikačné
testovanie (application testing)
• testovanie fungovania časti aplikácie – testovanie
jednotiek (unit testing)
– „jednotka“ – skupina tried, trieda, metóda, skupina
metód
Informatika 2
20
Biela a čierna skrinka
• testovanie bielej skrinky
– k dispozícii aj vnútorný pohľad
– využívajú sa znalosti o implementácii
– napr. kontrola stavu objektu, kontrola podmienok
podmienených príkazov a cyklov, ...
• testovanie čiernej skrinky
– k dispozícii je iba rozhranie
– kontrola reakcií na správu
– kontrola zhody očakávaných a získaných výsledkov
Informatika 2
21
Pozitívne a negatívne testovanie
• pozitívne testovanie
– kontrola prípadov, v ktorých sa očakáva úspešný
výsledok
– operácie nesmú zlyhať pre žiadnu z povolených
vstupných hodnôt
• negatívne testovanie
– testovanie prípadov, v ktorých sa očakáva zlyhanie
– informovanie o chybe – kontrola
– objekt sa nesmie dostať do nekorektného stavu ani ak
dostane neplatné vstupy
Informatika 2
22
Spôsoby testovania
• manuálne
• automatické
Informatika 2
23
Manuálne testovanie jednotiek
(1)
• tester v úlohe používateľa (procesora)
• ideálne: tester nie je autor programu
Informatika 2
24
Manuálne testovanie jednotiek
(2)
• prechádzanie zdrojového kódu
– vizuálne prechádzanie štruktúrou programu
– kontrola algoritmov
– kontrola stavu objektu v rôznych fázach algoritmu
vykonávanej testovanej metódy
• priama komunikácia s objektom
– napr. v prostredí BlueJ
– biela skrinka – využitie funkcie objekt inspector
Informatika 2
25
Využitie funkcie objekt inspector
• sledovanie reakcie objektu na správu
• object inspector ostáva otvorený
• kontrola stavu atribútov
– trieda
– inštancia
Informatika 2
26
Object inspector – príklad(1)
Informatika 2
27
Object inspector – príklad(2)
Informatika 2
28
Object inspector – príklad(3)
Informatika 2
29
Object inspector – príklad(4)
Informatika 2
30
Object inspector – príklad(5)
Informatika 2
31
Automatické testovanie
• na testovanie sa vytvorí špecializovaný program –
test
• test posiela správy testovanému programu,
kontroluje odpovede
• výsledky prezentuje testerovi
Informatika 2
32
Dôvody automatického testovania
• testy sa vykonávajú opakovane
• manuálne testy
– zdĺhavé – náročné na čas
– náchylné na chyby – ľudský činiteľ
• automatické testy
– rýchle vykonanie testu
– vždy rovnaký postup
– automatizácia rutinnej práce
Informatika 2
33
Testy regresie
• zásah do programu
– rozšírenie programu
– oprava chyby v programe
• zistiť, či nebola narušená zvyšná funkcionalita
programu
• opakovať všetky doteraz napísané testy
Informatika 2
34
TDD – Test driven development
• vývoj založený na testoch
• testy sa napíšu skôr ako sa začne s vývojom
programu
• v každej fáze vývoja sa dá jednoducho
skontrolovať funkčnosť programu
• Kent Beck: Programování řízené testy, Grada,
ISBN 80-247-0901-5
Informatika 2
35
Testovacie triedy
• unit test
• autori: Beck, Gamma
• automatické testovanie častí programu
• priama podpora v rôznych programovacích
jazykoch
• Java – knižnica JUnit
Informatika 2
36
Testovacia trieda
v JUnit
• jedna trieda = niekoľko testov jednej jednotky
– špeciálne klauzule v hlavičke – preberieme neskôr
• jedna metóda = jeden test
– verejná metóda
– bez parametrov a návratovej hodnoty
– ! názov musí začínať slovom test
Informatika 2
37
Príklad testu v JUnit(1)
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class TestDiara
{
@Before
public void setUp()
{
}
...
}
Informatika 2
38
Príklad testu v JUnit(2)
@Test
public void testVytvorTriUdalosti()
{
Den den1 = new Den(1);
Udalost vymysliet = new Udalost("Vymysliet", 1);
Udalost vykonat = new Udalost("Vykonat", 1);
Udalost zabudnut = new Udalost("Zabudnut", 1);
assertTrue(den1.vlozUdalost(9, vymysliet));
assertTrue(den1.vlozUdalost(10, vykonat));
assertTrue(den1.vlozUdalost(11, zabudnut));
}
Informatika 2
39
Príklad testu v JUnit(3)
@Test
public void testOtestujUdalost()
{
Udalost vymysliet = new Udalost("Vymysliet", 1);
Udalost vykonat = new Udalost("Vykonat", 2);
assertEquals(1, vymysliet.dajTrvanie());
assertEquals(2, vykonat.dajTrvanie());
assertEquals("Vymysliet", vymysliet.dajPopis());
assertEquals("Vykonat", vykonat.dajPopis());
}
Informatika 2
40
Správa assertEquals
• assert = tvrdiť, uistiť sa
• vyhodnocuje rovnosť parametrov
– áno - test pokračuje
– nie - test končí chybou
• assertEquals môže byť v každom teste použitý
ľubovoľný počet krát
this.assertEquals(ocakavana, skutocna);
Informatika 2
41
Správa assertTrue
• assert = tvrdiť, uistiť sa
• vyhodnocuje hodnota pravdivostného výrazu
– true - test pokračuje
– false - test končí chybou
this.assertTrue(pravdivostnyVyraz);
Informatika 2
42
Prípravky
• rôzne testy môžu pracovať s rovnakými objektmi
• prípravky (fixtures) – objekty prístupné vo
všetkých testoch v jednom unit teste
• reprezentované atribútmi testovacej triedy
• vytvárajú sa v špeciálnej metóde setUp
• vytvoria sa pred spustením každého testu
Informatika 2
43
Príklad testu v Junit, Fixtures(1)
private Den den1;
private Udalost vymysliet;
private Udalost vykonat;
private Udalost zabudnut;
@Before
public void setUp()
{
den1 = new Den(1);
vymysliet = new Udalost("Vymysliet", 1);
vykonat = new Udalost("Vykonat", 1);
zabudnut = new Udalost("Zabudnut", 1);
}
Informatika 2
44
Príklad testu v Junit, Fixtures(2)
@Test
public void testVytvorTriUdalosti()
{
assertTrue(den1.vlozUdalost(9, vymysliet));
assertTrue(den1.vlozUdalost(10, vykonat));
assertTrue(den1.vlozUdalost(11, zabudnut));
}
Informatika 2
45
Príklad testu v Junit, Fixtures(3)
@Test
public void testOtestujUdalost()
{
assertEquals(1, vymysliet.dajTrvanie());
assertEquals(2, vykonat.dajTrvanie());
assertEquals("Vymysliet", vymysliet.dajPopis());
assertEquals("Vykonat", vykonat.dajPopis());
}
Informatika 2
46
Unit testy v prostredí BlueJ
• využíva knižnicu JUnit
• „klikacie“ vytváranie testov
• zaznamenávanie činnosti testera
• dopĺňanie očakávaného parametra assertEquals
• záznam – telo testovacej metódy
• možnosť ukladania aktuálnych objektov v
prostredí BlueJ ako Fixtures
Informatika 2
47
Unit testy v prostredí BlueJ(1)
Informatika 2
48
Unit testy v prostredí BlueJ(2)
Informatika 2
49
Unit testy v prostredí BlueJ(3)
Informatika 2
50
Unit testy v prostredí BlueJ(4)
Informatika 2
51
Unit testy v prostredí BlueJ(5)
Informatika 2
52
Unit testy v prostredí BlueJ(6)
Informatika 2
53
Unit testy v prostredí BlueJ(7)
Informatika 2
54
Unit testy v prostredí BlueJ(8)
Informatika 2
55
Hranice
testovania
• úplne otestovať každý program vo všeobecnosti
nie je možné
• úspešný test nedokazuje, že program neobsahuje
žiadnu chybu
• čím viac chýb sa v programe nájde, tým viac ich
program obsahuje
• kombinácia viacerých spôsobov
Informatika 2
56
Ladenie
• testovanie pomôže nájsť, že existuje chyba
• ladenie pomôže nájsť, kde sa tá chyba nachádza
Informatika 2
57
Spôsoby ladenia
• manuálne prechádzanie kódu
• ladiace výpisy
• debugger
Informatika 2
58
Manuálne prechádzanie kódu
• programátor otvorí zdrojový kód
• vizuálne prechádza zdrojový kód a hľadá chybu
– manuálne vykonáva príkazy – je v úlohe procesora
– zaznamenáva aktuálne hodnoty premenných
– vyhodnocuje aktuálnu správnosť algoritmu
• jeden z najčastejších spôsobov ladenia
Informatika 2
59
Ladiace výpisy
• rozšírenie programu o výpisy aktuálneho stavu
objektov a algoritmov pomocou správy
System.out.println
• programátor vo výpise vidí, kde sa
objekty/algoritmy dostali do nesprávneho stavu
• ladiace výpisy môžu byť podmienené
– zapoznámkovanie
– ako vetva neúplného podmieneného príkazu
• ladiace výpisy môžu byť do súboru
Informatika 2
60
Debugger
• bug (chyba) = chyba v programe
• debugger – program asistujúci pri hľadaní chýb
– zobrazuje hodnoty všetkých dostupných premenných
– označuje príkaz, ktorý má byť aktuálne vykonaný
• „krokovanie“ programu
• možnosť nastavenia zarážok (breakpoint)
• programátor vyhodnocuje správnosť
dosiahnutého stavu
Informatika 2
61
Informatika 2
62
Informatika 2
63
Informatika 2
64
Informatika 2
65
chyba
Informatika 2
66
Informatika 2
67
Oprava chyby
• oprava chyby – zmena zdrojového kódu
• => regresné testovanie
Informatika 2
68
Výsledok po oprave
Informatika 2
69
Metóda inštancie triedy Programator
public Program vytvorProgram(Zadanie paZadanie)
{
Program program = this.napisProgram(paZadanie);
Test test = this.napisTestPre(program);
Chyba chyba = test.dajChybu(program);
while (chyba != null) {
InfoOChybe info = this.lad(program, chyba);
this.odstranChybu(program, info);
chyba = test.dajChybu(program);
}
return program;
}
Informatika 2
70
Písanie udržovateľného kódu
• čitateľnosť kódu
• konvencie
• dokumentačné komentáre
• komentáre v zložitejších miestach algoritmu
• samopopisné identifikátory
• súdržnosť (cohesion) – max.
• implementačná závislosť (coupling) – min.
Informatika 2
71
Vďaka za pozornosť
Automaticky vygenerovaný textový náhľad. Pre plné formátovanie si stiahnite súbor.
nechodím na prednášky