PDF

Mýliť sa je ľudské

Dvanásta prednáška

Formát
PDF
Veľkosť
2,5 MB
Pridané
Stiahnutí
750
Stiahnuť PDF · 2,5 MB

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

Otvoriť AI: ChatGPT · Claude · Gemini

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.