• Keine Ergebnisse gefunden

Te st fä lle

N/A
N/A
Protected

Academic year: 2021

Aktie "Te st fä lle"

Copied!
23
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Softwaretechnologie, © Prof. Uwe Aßmann1

4) V alidation eines Pro grams mit Hilfe von Tests

Prof. Dr. rer. nat. Uwe Aßmann Institut für Software- und Multimediatechnik Lehrstuhl Softwaretechnologie Fakultät für Informatik TU Dresden Version 11-0.2, 16.04.11

1)

G ru nd la ge n

1)

V al id at io n un d V er ifi ka tio n

2)

V er tr äg e

3)

Te st fä lle

2)

R eg re ssi o nst es ts m it de m JU ni t- R ah m en w er k

3)

E nt w ur fsm ust er in JU ni t

2Prof. Uwe Aßmann Softwaretechnologie

Li ter at ur

O bl ig at or isch e Li te ra tu r

Zuser Kap. 12 (ohne White-box tests) ST für Einsteiger Kap. 12 www.junit.org Junit 3.x arbeitet noch ohne Metadaten (@Annotationen) junit3.8.1/doc/cookstour/cookstour.htm. Schöne Einführung in Junit junit3.8.1/doc/faq/faq.htm Die FAQ (frequently asked questions) Achtung: JUnit 4 versteckt mehr Funktionalität in Metadaten http://junit.sourceforge.net/doc/cookbook/cookbook.htm http://junit.sourceforge.net/doc/faq/faq.htm

W ei te rf üh re nd

Andrew Hunt, David Thomas. The pragmatic programmer. Addison- Wesley. Deutsch: Der Pragmatische Programmierer. Hanser-Verlag. Uwe Vigenschow. Objektorientiertes Testen und Testautomatisierung in der Praxis. Konzepte, Techniken und Verfahren. dpunkt-Verlag, 2005.

(2)

Softwaretechnologie, © Prof. Uwe Aßmann3

4.1) Grundlagen des Testens

4Prof. Uwe Aßmann Softwaretechnologie

G rundl agen

Validation: Überprüfung der Arbeitsprodukte bzgl. der Erfüllung der Spezifikationen und der Wünsche des Kunden Verifikation: Nachweis, daß ein Programm seine Spezifikation erfüllt Formale Verifikation: MathematischerBeweis desselben Testen:Überprüfen von Abläufen eines Programms unter bekannten Bedingungen, mit dem Ziel, Fehler zu finden Wichtig: Vollständigkeit!

Te st ing show s the pre se nc e of bugs , but ne ve r the ir abs enc e (D ijk st ra ) V e ri fi ka ti on ze ig t, da ss da s P rogra mm se ine S p ez if ik at ion ri cht ig erf ül lt . V a lida ti on ze igt , da ss da s P rogra mm da s r ic h ti g e P robl em lös t.

Wikipedia: Verification and Validation: In engineering or a quality management system, "verification" is the act of reviewing, inspecting, testing, etc. to establish and document that a product, service, or system meets the regulatory, standard, or specification requirements. By contrast, validation refers to meeting the needs of the intended end-user or customer.

(3)

5Prof. Uwe Aßmann Softwaretechnologie

Test -Fi rst D evel opm ent

G es et z 62 de s P ra gm at isch en P ro gr am m ie re rs : Te st en S ie fr ü hze iti g, uf ig u nd a ut om at isch

W ei te re w ich tig e G ese tze d es pr ag m at isch en P ro gr am m ie re rs:

Gesetz 49 (PP): Testen Sie Ihre Software, sonst tun es die Anwender! Gesetz 32 (PP): Ein totes Programm richtet weniger Schaden an als ein schrottreifes. 6Prof. Uwe Aßmann Softwaretechnologie

V -M odel l m it S tandar d- Test pr ozess (R echt er A st des V )

Te st s w er de n bo tt om -u p er le di gt :

Zuerst Verträge und Testfälle für die Klasse bilden Dann die einzelne Klasse testen Dann die Komponente Dann das System Dann der beta-Test Zum Schluss der Akzeptanztest (Abnahmetest)

B itt e, a u ch so im P ra kt iku m vo rg eh en .

Analyse Grobentwurf Feinentwurf Implementierung

Abnahmetest Systemtest Integrationstest Komponententest Zusicherungen Methodentest Klassentest

Testlle Testlle Testlle Gesetz 63 (PP): Das Programmieren ist nicht getan, bis alle Tests erfolgreich waren

(4)

Prof. Uwe Aßmann Softwaretechnologie

S of tw ar e hat ei ne test -get riebene A rchi tekt ur

E in te st -ge tri ebe ne s S ys te m (t es t- dri ve n sy st em) b e st e ht a us ei ne m P ro gr am m ( S ys te m u nd er T e st , S U T ) m it se in er Te st um ge bu ng ( Te st -T re ib er )

Te st s m üsse n vo r de m S yst em ei nsa tz er fo lg re ich b est an de n w er de n

B ei sp ie l: TD D ( Te st -D rive n D eve lo pm en t)

I. G . zu P ro gr am m en h at S of tw ar e ha t ei ne t est ge tr ie be ne A rch ite kt ur

KomparatorKomparator ProgrammProgramm Test-Umgebung

Error OkInputEingabedaten Ausgabedaten (Ist)

Ausgabedaten (Soll) Prof. Uwe Aßmann Softwaretechnologie

B ei spi el : W ie sc hr ei bt m an ei nen Test fü r ei ne M et hode?

W ie t est et m an pa rse D ay( S tr in g d) ?

// A class for standard representation of dates. public class Date { public int day; public int month; public int year; public Date(String date) { day = parseDay(date); month = parseMonth(date); year = parseYear(date); } public int parseDay(String d) { if (d.matches(„\d\d\.[\s]\d\d\.[\s]\d\d\d\d“)) { // German numeric format day. month. Year return string2Int(d.substring(0,2)); } else { .. other formats... } } }// A class for standard representation of dates. public class Date { public int day; public int month; public int year; public Date(String date) { day = parseDay(date); month = parseMonth(date); year = parseYear(date); } public int parseDay(String d) { if (d.matches(„\d\d\.[\s]\d\d\.[\s]\d\d\d\d“)) { // German numeric format day. month. Year return string2Int(d.substring(0,2)); } else { .. other formats... } } }

(5)

9Prof. Uwe Aßmann Softwaretechnologie

A nt w or t: Inner e C hecks und äusser e Test s

Inne re C he ck s (V ert ra gs prüf unge n, c ont ra ct c he ck s) : in n er ha lb de r M et h od e w er de n Ü be rp rü fu n ge n ei ng e ba u t, d ie b e st im m te Zu si ch er un ge n er re ich en

Innere Checks bestehen aus dem Überprüfen von Verträgen innerhalb von Methoden mit Hilfe von Probebeschicken von Methoden mit ausgewählten Parametern (Testdaten)

Ä us se re T es ts : N ach A u fr uf e in e r M et ho de m it Te st da te n w er de n R el a tio ne n zw isc he n E in -, u n d A usg ab e pa ra m et er n so w ie d e m Zu st an d üb er pr üf t

Black-box-Tests (schwarze Tests): bestehen aus dem Aufstellen von Testfällen (Testdaten für Eingabe-, Ausgabeparametern und Zustandsbelegungen) und deren Überprüfung nach Abarbeitung der Methode ohne Kenntnis der Implementierung der Methode White-box-Tests (weiße Tests): dto, aber mit Kenntnis über die Implementierung der Methode (z.B. Kenntnis der Steuerfluss-Pfade) 10Prof. Uwe Aßmann Softwaretechnologie

Inner e C hecks: V er tr agspr üf ung für ei ne M et hode

Inv ari ant en (i nv ari ant s) : B ed in g un g en ü be r de n Z ust an d (W er te vo n O bj ekt en u nd V ar ia bl en ), d ie im m er g ül tig si nd

V orbe di ngung (pre condi ti on, A nna hme n, a ss umpt ions ):

Zustand (Werte von Variablen), der vor Aufruf (bzw. Vor Ausführung der ersten Instruktion) gilt bzw gelten muss Typen von Parametern Werteeinschränkungen von Parametern

N ac hb ed ingu ng (p os tc ond it ion , G ar an ti en, gua ra n te es , promi se s) :

Zustand (Werte von Variablen), die nach Aufruf (bzw. nach Ausführung der letzten Instruktion) gültig sind Zuordnung von Werten von Eingabe- zu Ausgabeparametern (Ein- Ausgaberelation) Gesetz 31 (PP): Verwenden Sie Design by Contract (Vertragsprüfung), damit der Quelltext nicht mehr und nicht weniger tut, als er vorgibt. Gesetz 33 (PP): Verhindern Sie das Unmögliche mit Zusicherungen.

(6)

Prof. Uwe Aßmann Softwaretechnologie

V er tr agspr üf ung für ei ne M et hode m it E xcept ions

E in e fe hl ge sch la ge ne V e rt ra gsp rü fu ng ka n n e in e A usn ah m e (e xce pt io n) a usl öse n, m itt el s

throw

-A nw ei su ng

public int parseDay(String d) { if (d.equals(„“) throw DateInvalid; if (d.size() < 10) throw DateTooShort; if (d.matches(\d\d\.[\s]\d\d\.[\s]\d\d\d\d“)) { if (d.size() < 10) throw DateTooShort; // German numeric format day. month. Year int day = string2Int(d.substring(0,2)); if (day < 1 or day > 31) throw DayTooLarge; } else { .. other formats... } if (d.size() < 10) throw DateTooShort; if (day < 1 or day > 31) throw somethingWrong; return day; }public int parseDay(String d) { if (d.equals(„“) throw DateInvalid; if (d.size() < 10) throw DateTooShort; if (d.matches(\d\d\.[\s]\d\d\.[\s]\d\d\d\d“)) { if (d.size() < 10) throw DateTooShort; // German numeric format day. month. Year int day = string2Int(d.substring(0,2)); if (day < 1 or day > 31) throw DayTooLarge; } else { .. other formats... } if (d.size() < 10) throw DateTooShort; if (day < 1 or day > 31) throw somethingWrong; return day; }

Vorbedingung (precondition, assumption): D ist ein String D ist nicht leer

Invarianten (invariants): D ist mindestens 10 Zeichen lang (Datum plus Trenner) Nachbedingung (postcondition, guarantee): Ein int wird zurückgegeben Zwischen 1 und 31 Prof. Uwe Aßmann Softwaretechnologie

V er tr ag ei ner M et hode – P rüf en dur ch asser t

assert()

, e in e S ta n da rd m et h od e , b rich t d as P ro g ra m m b ei V er le tzu ng e in er V er tr ag sb ed in gu ng a b

A ch tu ng : B ed in g un ge n m üs se n d u al z u de n B ed in g un g en d er vo rg en an nt en A usn ah m en f or m ul ie rt se in !

public int parseDay(String d) { assert(!d.equals(„“)); assert(d.size() >= 10)); if (d.matches(\d\d\.[\s]\d\d\.[\s]\d\d\d\d“)) { assert(d.size() >= 10); // German numeric format day. month. Year int day = string2Int(d.substring(0,2)); assert(day >= 1 and day <= 31); } else { .. other formats... } assert(d.size() >= 10); assert(day >= 1 and day <= 31); return day; }public int parseDay(String d) { assert(!d.equals(„“)); assert(d.size() >= 10)); if (d.matches(\d\d\.[\s]\d\d\.[\s]\d\d\d\d“)) { assert(d.size() >= 10); // German numeric format day. month. Year int day = string2Int(d.substring(0,2)); assert(day >= 1 and day <= 31); } else { .. other formats... } assert(d.size() >= 10); assert(day >= 1 and day <= 31); return day; }

(7)

13Prof. Uwe Aßmann Softwaretechnologie

Ä uße re T est s: A uf sc hr ei ben vo n Test fäl le n in Test fal ltabel len

E in Te st fa ll ta be lle se tzt fü r ei n e au fzu ru fe n de M et ho de E in -, A u sg ab ep a ra m et er , l oka le V ar ia bl en u nd O bj ekt at tr ib u te in B ezi eh un g.

Gut-Fall (Positivtest): Testfall, der bestanden werden muss Fehlerfall (Negativtest): Testfall, der scheitern muss Ausnahmefall (Exception Test):Testfall, der in einer Exception (Ausnahme) des Programms enden muss, also einer kontrollierten Fehlersituation

D ie T est fa llt ab el le sp ezi fizi er t al so e in en V er tr ag e xe m pl ar isch

A u s je de r Ze ile d er T est fa llt ab e lle w ird e in a sse rt () -T est e rze u gt , d er na ch d em A uf ru f de r P ro ze du r au sg ef üh rt w ird

Testet die Relation der Ein- und Ausgabeparameter, sowie der Objektattribute 14Prof. Uwe Aßmann Softwaretechnologie

B ei spi el : T est ei ner D at um skl asse

// A class for standard representation of dates. public class Date { public int day; public int month; public int year; public Date(String date) { day = parseDay(date); month = parseMonth(date); year = parseYear(date); } public int equals(Date d) { return day == d.day && year == d.year && month == d.month; } }// A class for standard representation of dates. public class Date { public int day; public int month; public int year; public Date(String date) { day = parseDay(date); month = parseMonth(date); year = parseYear(date); } public int equals(Date d) { return day == d.day && year == d.year && month == d.month; } }

(8)

Prof. Uwe Aßmann Softwaretechnologie

B ei spi el ei ner zugehör igen Test fal ltabel le

Te st fa llt ab el le n en th al te n Te st fä lle ( G ut -, Fe hl er- , A us na hme lle )

NrKlasseEingabedatenAusgabedatenErwarteter Status daymonthyear 1Gutfall1. Januar 2006112006Ok 2Gutfall05/12/20085122008Ok 3GutfallJanuary 23, 20172312017Ok 4Fehlerfall44, 2007Failure 5FehlerfallAup 23, 2005Failure 6AusnahmeMarch 44, 2007Exception Prof. Uwe Aßmann Softwaretechnologie

FI T T est fal ltabel len Fr am ew or k ht tp: //f it. c2. com

FI T b ie te t e in e S pe zi fika tio n de r Te st fä lle in W or d od er E xce l

Automatische Generierung von Junit-Testfällen Automatischer Feedback

si eh e S of tw ar et ech no lo gi e- II , W S

http://fit.c2.com/files/WelcomeVisitors/example.gif

(9)

17Prof. Uwe Aßmann Softwaretechnologie

public class DateTestCase { Date d1; Date d2; Date d3; public int testDate() { d1 = new Date(„1. Januar 2006“); d2 = new Date(„05/12/2008“); d3 = new Date(„January 23rd, 2009“); assert(d1.day == 1); assert(d1.month == 1); assert(d1.year == 2006); assert(d2.day == 5); assert(d2.month == 12); assert(d2.year == 2008); assert(d3.day == 23); assert(d3.month == 1); assert(d3.year == 2009); } } public class DateTestCase { Date d1; Date d2; Date d3; public int testDate() { d1 = new Date(„1. Januar 2006“); d2 = new Date(„05/12/2008“); d3 = new Date(„January 23rd, 2009“); assert(d1.day == 1); assert(d1.month == 1); assert(d1.year == 2006); assert(d2.day == 5); assert(d2.month == 12); assert(d2.year == 2008); assert(d3.day == 23); assert(d3.month == 1); assert(d3.year == 2009); } }

N euer T est fal l

Te st fä lle w er de n in e in e Te st fa llkl asse g esch rie be n

Die Testdaten befinden sich in einer Halterung (fixture) Eine Testfallklasse kann mehrere Testfälle aus der Testfalltabelle enthalten Halterung (fixture) 18Prof. Uwe Aßmann Softwaretechnologie

Wi e w ähl e ich Test dat en aus?

B est im m e di e E xt re mw ert e d er P ar am et er d er z u te st en d en M et ho de

Nullwerte immer testen, z.B. 0 oder null Randwerte, z.B. 1.1., 31.12

B est im m e B ere ic hs ei ns chrä nk unge n

Werte ausserhalb eines Zahlenbereichs negative Werte, wenn natürliche Zahlen im Spiel sind

B est im m e Zus nde , i n d en e n si ch e in O bj ekt n ach e in er A nw e isu n g be fin de n m uss

B est im m e Ä qui va le nzk la ss en vo n Te st da te n un d te st e nu r d ie R ep rä se nt an te n

B est im m e al le W er te a lle r bool sc he n B edi ngunge n in d er M et ho de

Raum aller Steuerflußbedingungen

(10)

Softwaretechnologie, © Prof. Uwe Aßmann19

4.2) Regressionstests mit dem JUnit- Rahmenwerk

20Prof. Uwe Aßmann Softwaretechnologie

Test fäl le

Te st fa ll : H er be ifü hr en e in er b es tim m te n P ro g ra m m -S itu a tio n, m it be st im m te n Te st da te n

Te st da te n : E in ga be , di e ei ne n ko nkr et en T est fa ll he rb ei fü hr t

Te st da te ns at z : E in - un d A u sg ab ed at en , d ie zu e in e m T e st fa ll ge hö re n

R egre ss ions te st : A ut om at isi er te r V e rg le ich vo n A usg a be da te n (g le ich er T est fä lle ) un te rsch ie dl ich er V er si on en d es P ro gr am m s.

Da zu großen Systemen mehrere 10000 Testdatensätze gehören, ist ein automatischer Vergleich unerläßlich. Beispiel: Validierungssuiten von Übersetzern werden zusammen mit Regressionstest-Werkzeugen verkauft. Diese Werkzeuge wenden den Übersetzer systematisch auf alle Testdaten in der Validierungssuite an

(11)

21Prof. Uwe Aßmann Softwaretechnologie

D as JU ni t R egr essi onst est -Fr am ew or k

JU ni t

www.junit.org

ist e in t ech n isch e s Ja va -Fr am ew or k fü r R eg re ssi on st est s, so w oh l f ür e in ze ln e K la sse n ( un it te st ) , a ls au ch fü r S yst em e

Durchführung von Testläufen mit Testsuiten automatisiert Eclipse-Plugin erhältlich Mittlerweile für viele Sprachen nachgebaut

Ju ni t 3 .8 .1 :

88 Klassen mit 7227 Zeilen im Kern des Rahmenwerks: 10 Klassen (1101 Zeilen)

Te st re su lta te :

Failure (Zusicherung wird zur Laufzeit verletzt) Error (Unvorhergesehenes Ereignis, z.B. Absturz) Ok

JU ni t- 4 ve rst eckt m eh r Fu n kt io n al itä t m it M e ta da te n (@A nn ot at io ne n ) un d ist w ese nt lich ko m pl exe r. E m pf eh lu ng : Le rn en S ie zu er st 3 .8 .1 !

22Prof. Uwe Aßmann Softwaretechnologie

K er n von JU ni t 3. 8. 1

run(TestResult)Test run(TestResult) runTest() setUp() tearDown()

TestCase String name run(TestResult) add()

TestSuite

component TestResult setUp(); runTest(); tearDown(); MyTestCase .. init of test data runTest() setUp() tearDown() .. test methods testConversion() testInput()

TextTestResult UITestResult ... reason why failed ... test data

*

(12)

Prof. Uwe Aßmann Softwaretechnologie

E xkur s: E rkunde JU ni t 3. 8. x m it Javadoc

A uf ga be :

laden Sie die API-Dokumentation von JUnit mit einem Brauser Ihrer Wahl finden Sie die Aufgabe der Klassen TestResult, TestCase und TestSuite heraus Welche Aufgabe hat die Klasse Assert? Gesetz 68 (PP): Bauen Sie die Dokumentation ein, anstatt sie dranzuschrauben

/home/ua1/Courses/ST1/Material/junit3.8.1/javadoc/index.html Prof. Uwe Aßmann Softwaretechnologie

B ei spi el : T est der D at um skl asse in JU ni t

// A class for standard representation of dates. public class Date { public int day; public int month; public int year; public Date(String date) { day = parseDay(date); month = parseMonth(date); year = parseYear(date); } public int equals(Date d) { return day == d.day && year == d.year && month == d.month; } }// A class for standard representation of dates. public class Date { public int day; public int month; public int year; public Date(String date) { day = parseDay(date); month = parseMonth(date); year = parseYear(date); } public int equals(Date d) { return day == d.day && year == d.year && month == d.month; } }

(13)

25Prof. Uwe Aßmann Softwaretechnologie

public class DateTestCase extends TestCase { Date d1; Date d2; Date d3; protected int setUp() { d1 = new Date(„1. Januar 2006“); d2 = new Date(„01/01/2006“); d3 = new Date(„January 1st, 2006“); } public int testDate1() { assert(d1.equals(d2)); assert(d2.equals(d3)); assert(d3.equals(d1)); .... more to say here .... } public int testDate2() { .. more to say here .... } protected int tearDown() { .. .. } } public class DateTestCase extends TestCase { Date d1; Date d2; Date d3; protected int setUp() { d1 = new Date(„1. Januar 2006“); d2 = new Date(„01/01/2006“); d3 = new Date(„January 1st, 2006“); } public int testDate1() { assert(d1.equals(d2)); assert(d2.equals(d3)); assert(d3.equals(d1)); .... more to say here .... } public int testDate2() { .. more to say here .... } protected int tearDown() { .. .. } }

N euer T est fal l i n Juni t 3. 8. x

Te st C ase s si nd M et ho de n, b eg in ne nd m it

test

In iti al isi er un ge n de r H al te ru ng m it

setUp

, A bb au m it

tearDown Halterung (fixture) 26Prof. Uwe Aßmann Softwaretechnologie

Test fal l al s K unde ei ner zu test enden K lasse

Te st fa llkl asse n si nd a lso “ K un de nkl asse n ” vo n zu te st en de n K la sse n,

die mittels äusserem Test deren Vorbedingungen, Invarianten und Nachbedingungen überprüfen Angewandt auf verschiedene Testdaten

Te st fa llkl asse n im iti er en “ K un de n”

unterliegen also dem Lebenszyklus eines objektorientierten Programms Aufbauphase (Testobjektallokation, Vernetzung) Arbeitsphase Rekonfigurationsphase Abbauphase

(14)

27Prof. Uwe Aßmann Softwaretechnologie

public class TestApplication { ... TestCase tc = new DateTestCase(„testDate1“); TestResult tr = tc.run(); } public class TestApplication { ... TestCase tc = new DateTestCase(„testDate1“); TestResult tr = tc.run(); }

B enut zung von Test C ase

V on E cl ip se a us: In e in er I D E w ie E cl ip se w er de n di e Te st fa ll- P ro ze du re n au to m at isch in sp izi er t un d ge st ar te t

V on e in em Ja va -P ro gr am m a us:

Ein Testfall wird nun erzeugt durch einen Konstruktor der Testfallklasse Der Konstruktor sucht die Methode des gegebenen Namens (“testDate1”) und bereitet sie zum Start vor mit Reflektion, d.h. Suche nach dem Methode in dem Klassenprototyp Die run() Methode startet den Testfall gegen die Halterung und gibt ein TestResult zurück 28Prof. Uwe Aßmann Softwaretechnologie

public class TestApplication { ... TestCase tc = new DateTestCase(„testDate1“); TestCase tc2 = new DateTestCase(„testDate2“); TestSuite suite = new TestSuite(); suite.addTest(tc); suite.addTest(tc2); TestResult tr = suite.run(); // Nested test suites TestSuite subsuite = new TestSuite(); ... fill subsuite ... suite.addTest(subsuite); TestResult tr = suite.run(); }

Test sui ten

E in e Te st su ite ist e in e K ol le kt io n vo n Te st fä lle n

Te st S ui te s si nd ko m po si t

(15)

29Prof. Uwe Aßmann Softwaretechnologie

Test R unner G U I

D ie K la ss en ju n it. a w tu i.T est R un n er , j u ni t.s w in gu i.T est R un ne r bi ld en ei nf ach G U Is, d ie T est re su lta te a nze ig en

G ib t m a n e in em K on st ru kt o r ei ne s Te st fa lls ei ne K la sse m it, fi nd e t e r di e “t est *” -M et ho de n (d ie T est fa llm et ho de n) se lb st än di g

D ie s ge sch ie ht m itt el s R ef le kt io n, d. h. A bs uch e n de r M et ho de nt ab el le n im K la sse np ro to typ en u nd M et ho de nsp ei ch er

public class TestApplication { public static Test doSuite() { // Abbreviation to create all TestCase objects // in a suite TestSuite suite = new TestSuite(DateTestCase.getClass()); } // Starte the GUI with the doSuite suite public static main () { junit.awtui.TestRunner.run(doSuite()); }public class TestApplication { public static Test doSuite() { // Abbreviation to create all TestCase objects // in a suite TestSuite suite = new TestSuite(DateTestCase.getClass()); } // Starte the GUI with the doSuite suite public static main () { junit.awtui.TestRunner.run(doSuite()); } Softwaretechnologie, © Prof. Uwe Aßmann30

4.2.2) Testläufe in Junit 4.X

(16)

Prof. Uwe Aßmann Softwaretechnologie

N euer T est fal l i n Juni t 4. X m it M et adat en- A nnot at ionen

TestCases sind Methoden, annotiert mit @test, Initialisierung und Abräumen mit @before, @after Metadaten-Annotationen in Java entsprechen Stereotypen bzw Tagged Values in UML. Sie sind durch Annotationstypen typisiert public class DateTestCase /* no superclass */ { Date d1; Date d2; Date d3; @before protected int setUp() { d1 = new Date(„1. Januar 2006“); d2 = new Date(„01/01/2006“); d3 = new Date(„January 1st, 2006“); } @test public int compareDate1() { assert(d1.equals(d2)); assert(d2.equals(d3)); assert(d3.equals(d1)); .... more to say here .... } @test public int compareDate2() { .... more to say here .... } }public class DateTestCase /* no superclass */ { Date d1; Date d2; Date d3; @before protected int setUp() { d1 = new Date(„1. Januar 2006“); d2 = new Date(„01/01/2006“); d3 = new Date(„January 1st, 2006“); } @test public int compareDate1() { assert(d1.equals(d2)); assert(d2.equals(d3)); assert(d3.equals(d1)); .... more to say here .... } @test public int compareDate2() { .... more to say here .... } }

Halterung (fixture) Prof. Uwe Aßmann Softwaretechnologie

public class TestApplication { ... DateTestCase tc = new DateTestCase(); Result tr = JUnitCore.run(tc.getClass()); } public class TestApplication { ... DateTestCase tc = new DateTestCase(); Result tr = JUnitCore.run(tc.getClass()); }

B enut zung von Test fal l-K lasse in 4. x

V on d er K om m an do ze ile :

java org.junit.runner.JUnitCore DateTestCase

V on E cl ip se a us: In e in er I D E w ie E cl ip se w er de n di e Te st fa ll- P ro ze du re n au to m at isch in sp izi er t un d ge st ar te t

V on e in em Ja va -P ro gr am m a us:

Ein Testfall wird erzeugt durch einen Konstruktor der Testfallklasse Suche den Klassenprototyp der Testfallklasse Die run() Methode von JUnitCore startet alle enthaltenen Testfälle über den Klassenprotoypen Starten aller annotierten Initialisierungen, Testfallmethoden, Abräumer und gibt ein “Result”-Objekt zurück

(17)

33Prof. Uwe Aßmann Softwaretechnologie

Juni t 4. X m it vi el en w ei ter en M et adat en- A nnot at ionen

Viele weitere Test-Annotationstypen sind definiert public class DateTestCase { Date d1; @beforeClass protected int setUpAll() { // done before ALL tests in a class } @afterClass protected int tearDownAll() { // done before ALL tests in a class } @test(timeout=100,expected=IndexOutOfBoundException.class) public int compareDate2() { // test fails if takes longer than 50 msec // test fails if IndexOutOfBoundException is NOT thrown .... more to say here .... } }public class DateTestCase { Date d1; @beforeClass protected int setUpAll() { // done before ALL tests in a class } @afterClass protected int tearDownAll() { // done before ALL tests in a class } @test(timeout=100,expected=IndexOutOfBoundException.class) public int compareDate2() { // test fails if takes longer than 50 msec // test fails if IndexOutOfBoundException is NOT thrown .... more to say here .... } } Softwaretechnologie, © Prof. Uwe Aßmann34

4.3) Entwurfsmuster in JUnit

(18)

Prof. Uwe Aßmann Softwaretechnologie

W as ist ei n E nt w ur fsm ust er ?

E in E nt w urf smus te r ist .. .

Eine Beschreibung einer Standardlösung für Ein Standardentwurfsproblem in einem gewissen Kontext

E in E nt w ur fsm ust er w ie de rv er w en de t be w äh rt e E nt w ur fsi nf or m at io n

Ein Entwurfsmuster darf nicht neu, sondern muss wohlbewährt sein

E n tw ur fs m u st er si n d ei n w ese nt ich es E n tw ur fsh ilf sm itt el a lle r In ge ni eu re

Maschinenbau Elektrotechnik Architektur

E nt w ur fsm ust er tr et en a uch in Fr am ew or ks w ie JU ni t a uf

Prof. Uwe Aßmann Softwaretechnologie

B ei spi el : E nt w ur fsm ust er in Juni t 3. x

E nt w ur fsm ust er si nd sp ezi fisch e S ze na rie n vo n K la sse n

run(TestResult)Test run(TestResult) runTest() setUp() tearDown()

TestCase String name run(TestResult) add()

TestSuite

Composite Composite

Leaf

component TestResult setUp(); runTest(); tearDown(); MyTestCase .. init of test data runTest() setUp() tearDown()

TextTestResult UITestResult ... reason why failed ... test dataTemplate Method

*

(19)

37Prof. Uwe Aßmann Softwaretechnologie

D ef in ie rt d as S ke le tt e in e s A lg o rit h m u ss es in e in e r S ch ab lo n en m et ho d e (t em pl at e m et ho d)

Die Schablonenmethode ist konkret

D el e g ie re T ei le zu a bst ra kt en H ak en m et ho de n ( ho ok m et ho ds)

die von Unterklassen konkretisiert werden müssen

V a rii e re V e rh al te n d er ab st ra kt en K la sse d u rch ve rsch ie de ne U nt er kl asse n

Separation des “fixen” vom “variablen” Teil eines Algorithmus

E nt w ur fsm ust er T em pl at eM et hod

... primitiveOperation1(); ... primitiveOperation2(); ...

AbstractClass TemplateMethod() primitiveOperation1() primitiveOperation2() ConcreteClass primitiveOperation1() primitiveOperation2() 38Prof. Uwe Aßmann Softwaretechnologie

B ei spi el T em pl at eM et hod: E in D at engener at or

P ar am et er isi er un g ei ne s G en er at or s m it A nza hl u nd P ro du kt io n

(Vergleiche mit TestCase aus JUnit) ... for (i = 0; i < howOften(); i++) { ... produceItem(); ...

DataGenerator generate() howOften() produceItem() TestDataGenerator howOften() produceItem()

return 5;return 5; String word = grammar.recurse(); println(word);

- Grammar grammar;

(20)

Prof. Uwe Aßmann Softwaretechnologie

E nt w ur fsm ust er C om posi te

Component commonOperation() add(Component) remove(Component) getType(int) Composite commonOperation() add(Component) remove(Component) getType(int)

Leaf commonOperation()

Client childObjects for all g in childObjects g.commonOperation()

}

Pseudo implementations

*

C om po si te b esi tzt e in e re ku rsi ve n -A gg re ga tio n zu r O be rkl asse

Aggregation („has-a“) Prof. Uwe Aßmann Softwaretechnologie

C om posi te in Juni t 3. x

M eh re re M et ho de n vo n Te st si nd ko m po si t st ru kt ur ie rt

run() countTestCases() tests() toString()

Referenzen

ÄHNLICHE DOKUMENTE

2010]: dynamic analysis; full Java, Android, application studies, BUT unsound, explicit flows (“taint”) only FlowDroid [Bodden 2013]: static analysis; no implicit flows,

The VIS will store facial images and fingerprints of all visa applicants and a check against the stored data will be performed at the border crossing.. The use of biometrics makes

Ohne an dieser Stelle das politische System der Vereinigten Staaten bis ins letzte Detail zu beschreiben 10 , kann die Funktionslogik sowie die wichtigsten Bestimmungsfaktoren

So kam der Hinweis, dass die Osterfelder Straße / Horster Straße, die im Fußverkehr als Barriere empfunden wird, für den Pkw- Verkehr ganz gesperrt oder zumindest die

Hence, the bill could be interpreted as authorizing the Attorney General to screen licensees and permit holders on a continuous basis to determine whether they have been

Dabei vermögen die Naturheilverfahren eine entscheiden- de Rolle in Prävention und Gesund- heitserziehung sowie in der Therapie funktioneller Erkrankungen zu spie- len, können

Gültig für Mitglieder des Kaufmännischen Verbands Basel und Baselland. Grund: Die Browser unterstützen den direkten Versand

Der Lieferschein wird verschlüsselt in der QS-Datenbank gespeichert und kann nach dem Upload nicht mehr eingesehen/gedownloadet werden.. Falls nötig, kann der hochgeladene