31
Programmieren 2 04 – Testen und Testautomatisierung Bachelor Medieninformatik Sommersemester 2016 Dipl.-Inform. Ilse Schmiedecke [email protected]

Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

1

Programmieren204– TestenundTestautomatisierung

BachelorMedieninformatikSommersemester2016

[email protected]

Page 2: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

2

§ ...denktjederProgrammierer,deretwasfertiggestellthat

§ Wennerselbstnichtordentlichtestet,findenanderedieFehler§ imungünstigstenFallderKunde§ imschlimmstenFalldieKriminologenundGerichtsmediziner

DasProgrammfunktioniertsuper!

Page 3: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

3

§ ProgrammierenerfordertSorgfalt!§ AuchwinzigeFehlerhabenFolgen§ BeispielMariner1§ Fehlerwerdenofterstspäterentdeckt§ BeispielAriane5

§ WasleistetTesten?§ FehlerhaftigkeitdesCodesbeweisen§ KorrektheitdesCodesbeweisen?à NEIN – aberdieAbwesenheitvorhersehbarerSchwachstellennachweisen

Testenwozu?

Page 4: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

4

§ VenussondeMariner1 (1962)§ nach290sec.wegenFlugbahnabweichungkontrolliertzerstört

Mariner1

FORTRAN-Code:

DO5K=1.3stattDO5K1,3

àDO5K=1.3nutzloseVariablenzuweisungstattSchleife!!

BeispielausVingenshow,ObjektorientiertesTesten

Page 5: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

5

§ BewährteTrägerrakete§ Ariane5(1996)deutlichschubstärkeralsihreVorgänger§ FehlerhafteFlugbahnkorrekturum20° führtezurSprengungnach30sec

Ariane5

5

BeispielausVingenshow,ObjektorientiertesTesten

ADA-Code:

VieleJahrelangzuverlässigfunktioniertà keineneueTestreihe

ErhöhteSchubstärkeführtezumZahlenüberlauf, dernichtabgefangenwurde

Page 6: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

6

§ TestenerfordertPhantasieundErfahrung§ "kannnichtpassieren"isteineTabu-Aussage!§ Esgibtdas"Gespür"desTesters

§ aberdaraufkannmansichnichtverlassen!§ beieinerProbefahrtfallenauchnichtalleMängelauf...

§ AmEndehilftnursystematischesTesten:§ Testwert-Tabellen§ Testwert-Generatoren§ SammelnvonTestfällen

Test-Propheten

Page 7: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

7

§ ManuellerTest:§ Eingabe/Aufrufmachen§ "gucken",obdaserwarteteVerhlatenvorliegt.§ Vorteil:InutitiondecktUnerwartetesauf§ Problem:Abdeckung,Wiederholbarkeit,Ermüdung

§ Verhaltensbeobachtung:§ TestausgabenindenCodestreuen§ AblaufimDebuggernachverfolgenundbewerten§ Vorteil:TestausgabenundBreakpointswiederverwendbar§ Problem:AufwandundAufmerksamkeit

Testtechniken

7

Page 8: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

8

§ DieTestfällewerdenprogrammiert§ DieEntscheidungüberGelingenundScheiternwirdebenfallsautomatisiert

§ Nachteil:Programmieraufwand§ Vorteil:Beliebigvielbeliebigoftwiederholbar

AutomatisierterTest

Programmier-aufwand

Wiederhol-barkeit

Page 9: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

9

§ ImveraltetenWasserfallmodellderSoftware-EntwicklungkommtderSystemtestganzamEnde.

§ TopoderFlop,wennallesschongetanist!§ vieleFehler"imInneren"bleibenunentdeckt§ HeutewirdwährendderEntwicklung

immerdasganzeSystemgetestet

TestenwährendderEntwicklung!

9

Analyse

Spezifi-kation

Entwurf

Implemen-tierung

Systemtest

Inbetrieb-nahme

Page 10: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

10

§ Beispiel Filmregister:§ AußenverhaltenimTestrichtig

§ EintragenundFindenklapptindenTests§ trotzfehlerhafterinnererStruktur:

§ "Abeautiful Mind"ungleich"ABeautiful Mind"§ zweiEinträge,dienichtgemeinsamaktualisiert

werden§ irgendwannspäterfliegendieFehlerauf!

NichtnurdasGesamtsystemtesten!

10

Analyse

Spezifi-kation

Entwurf

Implemen-tierung

Systemtest

Inbetrieb-nahme

Page 11: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

11

§ JedeKlassebesitzteinemain-MethodezumModultest§ TestenallerexportiertenMethoden§ TestenderinnerenDatenstuktur

§ BautaufandereKlassenauf,§ diealsgetestetangenommenwerden

Modultestsmitmain-Methoden

11

SupportLine

InputReader Responder

ResponseMap

MapElement

Page 12: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

12

§ EinJUnit-TestCaseisteineKlasse,dieeineandereKlassetestet

§ TestCaseenthältTests– Methoden,derenErgebnisspezifiziertistundvonJUnintüberprüftwird:

§ TestCaseenthältFixtures,mitdenenTestbedingungengeschaffen(undaufgelöst)werden:

TestautomatisierungmitJUnit

12

Page 13: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

13

§ TestCaseerzeugen:New>JUnitTestCase§ Name=<Klasse>Test§ Paket=tests

§ TestCaseausführen§ mitRunAsJUnitTest

BenutzunginEclipse

13

Page 14: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

14

§ Forderung:EinMapElementdarfnichtzweiNull-Parameterhaben!

§ TestCase

SupportLine:MapElement

Testscheitert– eswirdkeineException

geworfen

gescheitert(rot)

Page 15: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

15

§ "Repariert"(alsBeispiel,überdenSinnkannmanstreiten)

GelungenerTest

15

Testwiederholen(Rerun)gelungen(grün)

Page 16: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

16

§ ContainssolltebeliebigeStringskorrektverarbeiten,aber keinenleerenundkeinennull-Keyakzeptieren!

WeitermitderResponseMap

16

Page 17: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

17

§ DatenstrukturistArrayList<MapElement> responseList

§ AktuelleLösung

§ Korrektur:

Wasklapptnichtbei"contains"?

17

repariert

Page 18: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

18

§ LeerenStringabfangen:

ZweitesProblem:leererStringalsKey

18

Hinweis:DieVerwendungvonuncheckedExceptionsistzunächsteinfacher,mussaberspäternocheinmalüberdachtwerden!

Page 19: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

19

§ put(null,null)sollteExceptionwerfen:

§ aber:

§ Grund:irgendwannmal"ausgeblendet"

Wirdein(null,null)-Eintragverhindert?

19

Page 20: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

20

ProblemimletztenBeispiel:§ VordemTestlaufvonResponseMaphätteeinTestlauffür

MapElementdurchgeführtwerdenmüssen!

§ Wasgesternnochfunktionierte,kannheuteschonProblememitsichbringen(Ariane5!)

§ Abhilfe:NachjederÄnderungALLESdurchtesten.§ EinHochaufdieTestautomatisierung....

§ Regressionstest=NachjederVeränderungwiederaufdiealtenTestszurückkommen.

Regressionstest

Page 21: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

21

§ AlleTestsvonHandnacheinanderlaufenzulassen,ist§ mühsam§ fehlerträchtig

§ AutomatisierungalsTest-Suite-Klasse§ üblicherweiseAllTestsgenannt:

ALLESdurchtesten– Test-Suiten

21

Page 22: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

22

§ TestCase(nichtannotiert):§ KlassemiteinerMengevonTests (ohneReihenfolge!)undFixtures§ typischerweiseeinerKlassezugeordnet

§ Fixture ("Inventar")§ OperationenvorundnacheinemTestbzw.allenTestseinesTestcase§ @Before,@BeforeClass,@After,@AfterClass

§ Test§ @Test§ Methode,derenErgbenisvonJUnitüberprüftwird§ mitexpects,assert,failGelngen/Scheiternspezifiziert

§ TestSuite§ @RunWith(Suite.class)§ @Suite.classes({...})§ KlasseheißttypischerweiseAllTestsundistleer.§ TestCaseswerdenindergegebenenReihenfolgedurchgeführt

JUnitimÜberblick

22

Page 23: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

23

JUnit-Test-Annotationen

23Quelle:http://www.vogella.com/tutorials/JUnit/article.html

Page 24: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

24

JUnitAssert-Statements

24

Quelle:http://www.vogella.com/tutorials/JUnit/article.html

Page 25: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

25

§ UnitTestssindheuteeinMUSSinderSoftware-Entwicklung§ UrsprunginderAgilenSoftware-Entwicklung(xp)§ AllgemeinüblichinderOpenSource-Entwicklung:

§ große,weltweiteEntwicklergemeinde§ jedermussgründlichtesten,eheereineÄnderungveröffentlicht§ aufdemServerlaufenautomatischeAkzeptanztests,diefürjede

veröffentlichteÄnderunggefahrenwerden§ JUnitistselbsteinOpenSource-Projekt

§ Automatisierunggehtnochweiter:§ WerkzeugezumCompilierenundBereitstellenführenautomatische

Testsaus(Hudson,Jenkins...)§ "NightlyBuild"– JedeNachteinenneue,durchgetesteteVersionder

Software.

IstdasPraxis?

25

Page 26: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

26

§ UnitTests(Modultests)sindzunächsteinKonzeptderobjektorientiertenProgrammierung§ SUnitfürSmalltalkwarderPrototyp

§ InähnlicherFormfüralleOO-Sprachenvorhanden§ NUnitfürdas.NET-Framework,PHPUnitfürPHP,

CppUnitfürC++,DUnit fürDelphi,QUnitfürJavaScript,etc.

§ AlsKonzeptauchfürandereSprachenundgrafischeOberflächenweitergeführt

§ GroßeTestframeworksfürheterogeneProjekte§ SeleniumfürWebanwendungen

NurfürJava?

26

Page 27: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

27

§ EinAPIoderKlasseninterfacewirftvieleFragenauf:BeispielMovieRegister-Interface§ WassollbeimEintrageneinesleerenTitelspassieren?§ Wassollpassieren,wennderenglischeundderdeutscheTitelgleich

sind?§ Wassollpassieren,wennaddMovie()füreinenbereitsvorhandenen

Filmaufgerufenwird?§ Wassollpassieren,wennbeiupdateMovie eineleereSchauspielerliste

angegebenwird,dievorhandeneabernichtleerist?§ Darfmanmitcontainsauchnachnullund""suchen?§ DarfeinTitelbeliebigeSonderzeichen enthalten?§ WiegenaumüssenTitelübereinstimmen,damitsieidentifiziertwerden

(Groß/Kleinschreibung,Leerzeichen,Tippfehler)?§ WiesolldasSystem"fastgleiche"Titelbehandeln?§ .....

TestDrivenDevelopment(TDD)

27

Page 28: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

28

§ MankanndieFragendurchKommentarebeantworten§ ImTDDwirdausjederFrageeinenTestfallmitdefiniertemAusgangmachen§ Dasistgenauer§ DasistfürsTestensofortnützlich§ FragenundUnklarheitenwerdenaufdenPunktgebracht

§ TDDbedeutet:§ erstdieTestfällefestlegen§ dannimplementieren§ danntesten

SpezifikationdurchTestfälle

28

Page 29: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

29

§ Forderung:EinMapElementdarfnichtzweiNull-Parameterhaben!

§ TestCase

FalscheForderungimnachträglichenTest

Testscheitert– eswirdkeineException

geworfen

gescheitert(rot)

ForderungimSupportline—ontext (Gesamtsystem):EinMap-Elementdarfkeinennull-Schlüsselhaben,wennderWertnichtnullist.

Page 30: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

30

§ DasBeispielzeigt:§ nachträglichformuliertmanleichtfalscheBedingungen

§ SpezifikaitiondurchTestfällebedeutet§ Präzisierung§ frühzeitigesNachdenkenüberGrenzfälle

à TDDistführtzubesseremCodeà denTester-Blickbrauchtmantrotzdem

TDDistbesser

30

TDDistStandardinderagilenEntwicklung!

Page 31: Prg2-04-Testen und Testautomatisierung · 2016-04-04 · § mit Run As JUnit Test Benutzung in Eclipse 13. 14 § Forderung: Ein MapElement darf nicht zwei Null-Parameter haben! §

31

...undtrotzallerAutomatisierung:DerTestermitdem"Riecher"wird

gebraucht

AbjetztwirdjederCodegetestet!

J

31