Pleiten, Pech und PatternTesting [email protected] Quelle: http://commons.wikimedia.org/wiki/File:Stöwer_Titanic.jpg Donnerstag, 28. Januar 2010 „Pleiten, Pech und PatternTesting“ („Mishaps, Missteps and PatternTesting“) The famous last words: • Our program does not crash! • This ship can‘t sink! (Image: from http://commons.wikimedia.org/wiki/File:Stöwer_Titanic.jpg) 1 neugierig? ängstlich? http://www.flickr.com/photos/stalkerr/527729423/ Donnerstag, 28. Januar 2010 Ziel dieser Präsentation ist, Sie • neugierig auf PatternTesting zu machen, • Interesse zu wecken • die Angst vor AOP nehmen image from http://www.flickr.com/photos/stalkerr/527729423/ 2 Donnerstag, 28. Januar 2010 some words about agentes (http:www.agentes.de): • seit 2004 • IT-Dienstleister f. Finanzwelt und Versicherungen • Focus: Java/JEE und „Quality Driven Development“ some words about me (Oliver Böhm, http://oli.blogger.de): • Java seit 1999 („Dot-Com-Hype“) • AOP/AspectJ seit 2004 • Board-Member der Java User Group Stuttgart 3 Pleiten Pech Pattern Testing Donnerstag, 28. Januar 2010 Die größten Pannen: • Mariner 1 • Ariane 5 • Toll Collect • Gesundheitskarte (health card) • EC-Karte(error in security chip) Dummerweise tauchen Fehler erst dann auf, wenn sie den größten Schaden anrichten (Murphy‘s Law) PatternTesting hilft dabei, diese Fehler auftauchen zu lassen, bevor die Anwendung ausgeliefert wird. 4 Begrüßung Pattern Testing Ausblick Text Pleiten, Pech, ... NPE Exception Einbindung Pattern Testing-xx Quelle: http://de.wikipedia.org/w/index.php?title=Datei:Karte_Cook_Seereise_nr1.png Donnerstag, 28. Januar 2010 Diese Karte von http://upload.wikimedia.org/wikipedia/commons/1/13/ Karte_Cook_Seereise_nr1.png zeigt die erste Reise von Captain James Cook. Eine Entdeckungsreise ist in vielen Fällen vergleichbar mit einem SW-Projekt: • es lauern viele Gefahren und Unwägbarkeiten • man weiß nie, ob man das Ziel erreicht • Leute gehen über Bord • manchmal geht es überhaupt nicht voran (Flaute) • machmal geht es ziemlich stürmisch zu • Kapitän und Manschaft sind aufeinander angewiesen 5 Software matters... 2009 2005 Elektrik Zündanlage Motor 0 % 10 % 20 % 30 % 40 % Donnerstag, 28. Januar 2010 inzwischen: SW immer stärker vertreten Beispiel Auto: SW-Fehler (hier unter Elektrik „versteckt“) sind im Vormarsch! Quelle: http://www1.adac.de/Auto_Motorrad/ aaaaapannenstatistik_maengelforum/pannenstatistik_2008/teile_verursacher/default.asp?TL=2 http://www1.adac.de/Auto_Motorrad/pannenstatistik_maengelforum/pannenstatistik_2006/Verteilung_Ursachen/default.asp?ComponentID=179508&SourcePageID=179528 6 ... declare vertical_veloc_sensor: float; horizontal_veloc_sensor: float; vertical_veloc_bias: integer; horizontal_veloc_bias: integer; ... begin declare pragma suppress(numeric_error, horizontal_veloc_bias); begin sensor_get(vertical_veloc_sensor); sensor_get(horizontal_veloc_sensor); vertical_veloc_bias := integer(vertical_veloc_sensor); horizontal_veloc_bias := integer(horizontal_veloc_sensor); ... exception when numeric_error => calculate_vertical_veloc(); when others => use_irs1(); end; end irs2; Ariane 5 37 Sekunden nach Zünden der Rakete (30 Sekunden nach Liftoff) erreichte Ariane 5 in 3700 m Flughöhe eine HorizontalGeschwindigkeit von 32768.0 (interne Einheiten). Dieser Wert lag etwa fünfmal höher als bei Ariane 4. Die Umwandlung in eine ganze Zahl führte daher zu einem Überlauf, der jedoch nicht abgefangen wurde. Der Ersatzrechner (Redundanz !) hatte das gleiche Problem schon 72 msec vorher und schaltete sich sofort ab. Daraus resultierte, daß Diagnose-Daten zum Hauptrechner geschickt wurden, die dieser als Flugbahndaten interpretierte. Daraufhin wurden unsinnige Steuerbefehle an die seitlichen, schwenkbaren Feststoff-Triebwerke, später auch an das Haupttriebwerk gegeben, um die großen Flugabweichungen (über 20 Grad) korrigieren zu können. Die Rakete drohte jedoch auseinanderzubrechen und sprengte sich selbst (39 sec). http://www.flickr.com/photos/lolodoc/3845299578/ Donnerstag, 28. Januar 2010 Beispiel Ariane: • altes Programm wurde wiederverwendet • aber: neue Randbedingungen! (führten zu einem Überlauf) • Tests wurden „eingespart“ 7 http://www.flickr.com/photos/bitzcelt/3058009462/ Donnerstag, 28. Januar 2010 Beispiel EC-Karten / Security-Chip - sollte angeblich sicherer sein. Hat nur leider nicht ganz funkitionert. Werden so künftig EC-Karten gegen unbefugten Zugriff abgesichert? Bildquelle: http://www.flickr.com/photos/bitzcelt/3058009462/ 8 Donnerstag, 28. Januar 2010 Geben Sie doch mal „"java.lang.NullPointerException" filetype:jsp“ in Google ein. Das Ganze können sie noch mit „site:ihrefirma.de“ koppeln und hoffen, dass Google nichts findet. 9 Marvin: http://www.flickr.com/photos/paperpariah/2417220138/ Donnerstag, 28. Januar 2010 Wie verhält sich unsere Anwendung im Ernstfall? Lassen wir hier Marwin (den depressiven Roboter aus „Per Anhalter durch die Galaxies“, Bild: http://www.flickr.com/photos/ paperpariah/2417220138/) mal auf unsere Anwendung los. 10 SQLException Donnerstag, 28. Januar 2010 Ups! 11 NullPointerException Marvin: http://www.flickr.com/photos/paperpariah/2417220138/ Donnerstag, 28. Januar 2010 Nächster Versuch... 12 Overflow Marvin: http://www.flickr.com/photos/paperpariah/2417220138/ Donnerstag, 28. Januar 2010 nächster Versuch... 13 List<Bug> findBugs() { ... // nothing found return null; } Donnerstag, 28. Januar 2010 Beispiel: eine einfache Anwendung, um eine Käfer-Sammlung zu verwalten (Briefmarkensammlungen sind out:-) 14 a() b() null findbugs() c() Donnerstag, 28. Januar 2010 Anatomie einer NullPointerException 15 c() ist schuld!? a() b() c() Donnerstag, 28. Januar 2010 null findbugs() NPE 16 Wer ist schuld? Laut Stacktrace „c()“ - aber liegt die Ursache nicht ganz woanders? Nämlich in „findbugs()“? Demo http://www.flickr.com/photos/libertinus/2847368801/ Donnerstag, 28. Januar 2010 Vorführung des demo-Projekts 17 a() b() Donnerstag, 28. Januar 2010 AssertionError: findBugs() returns null! findbugs() 18 Fügt man PatternTesting Check.RT als AspectJ-Bibliothek hinzu (und ruft die JavaVM mit „-ea“ auf), dann knallt es jetzt in „findbugs()“. Dazu muss man • das Projekt in ein AspectJ-Projekt wandeln (AJDT-Plugin muss installiert sein) • unter „AspectJ Build / Aspect Path“ muss patterntesting-rt.jar und patterntesting-checkrt.jar aufgenommen werden • Assertion müssen enabled sein (java -ea ...) List<Bug> findBugs() { ... // nothing found return Collections.EMPTY_LIST; } Donnerstag, 28. Januar 2010 So sollte man eine leere Ergebnismenge zurückliefern! 19 Begrüßung Pattern Testing Ausblick Text Pleiten, Pech, ... NPE Einbindung Testing Pattern Testing-xx Quelle: http://de.wikipedia.org/w/index.php?title=Datei:Karte_Cook_Seereise_nr1.png Donnerstag, 28. Januar 2010 20 Pattern Donnerstag, 28. Januar 2010 PatternTesting besteht aus 2 Wörtern: Pattern + Testing 21 Front End Middle Tier Back End http://www.flickr.com/photos/ann/1329361/ Donnerstag, 28. Januar 2010 bekanntes Pattern: Schichtenmodell 22 AntiPattern Donnerstag, 28. Januar 2010 Neben Pattern („Best Practices“) gibt es auch Anti-Pattern („Bad Practices“) 23 http://www.flickr.com/photos/telstar/61497944/ Donnerstag, 28. Januar 2010 bekanntes Anti-Pattern (oft anzutreffen): Spaghetti-Code • verworener Ablauf • keine Strukturen erkennbar 24 Lava-Flow http://www.flickr.com/photos/wildphotons/2443327380/in/set-72157603044987010 Donnerstag, 28. Januar 2010 25 weniger bekannt, aber auch oft anzutreffen: Lava-Flow (auch bekannt als „Dead Code“) Beschreibt den Umstand, dass in einer Anwendung immer mehr „toter Quelltext“ herumliegt. Dieser wird nicht mehr genutzt. Statt ihn zu löschen, werden im Programm immer mehr Verzweigungen eingebaut, die um den besagten Quelltext herumlaufen oder auf ihn aufbauen. (Quelle: http://de.wikipedia.org/wiki/Anti-Pattern) try { ... } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } Donnerstag, 28. Januar 2010 e.printStackTrace(): schlechter Stil 26 AntiPattern Testing Donnerstag, 28. Januar 2010 PatternTesting müsste eigentlich „Anti“-PatternTesting heißen, da es beim Aufspüren von „Bad Practices“ hilft 27 ! try { ... } catch (MalformedURLException e) { logging should be done // TODO Auto-generated Nocatch block using e.printStackTrace(); Throwable.printStackTrace() } Donnerstag, 28. Januar 2010 Diese Fehlermeldung („No logging should be done using Throwable.printStackTrace()“) wird von PatternTesting zur Compile-Zeit ausgeworfen. 28 http://www.flickr.com/photos/wildphotons/2443327380/in/set-72157603044987010 Donnerstag, 28. Januar 2010 Der ClasspathMonitor dient u.a. dazu, um „erkaltete“ (tote) Klassen im Programm zu finden. Optional kann man auch die Annotation @ProfileMe einsetzen, um Methoden zu finden, die 0-mal aufgerufen wurden. 29 ProfileStatistic Label Unit LastValue Hits Avg Total patterntesting.sample.World.main(String[]) ms. 20 1 20 20 patterntesting.sample.World.printHelloAgain()ms. 0 1 0 0 new patterntesting.sample.World() ms. 0 0 0 0 patterntesting.sample.World.printBye() ms. 0 0 0 kalt0 http://www.flickr.com/photos/wildphotons/2443327380/in/set-72157603044987010 Donnerstag, 28. Januar 2010 Hier ein Beispiel für die ProfileStatistic - Hits = 0 bedeutet, diese Methode wurde nie aufgerufen! 30 It is not allowed to use the JDBC API from here! http://www.flickr.com/photos/ann/1329361/ Donnerstag, 28. Januar 2010 PatternTesting bietet auch Vorkehrungen, um Verletzungen gegen ein Schichtenmodell zu finden. 31 http://www.flickr.com/photos/ava_babili/458428968 Donnerstag, 28. Januar 2010 Samples Concurrent Check.RT Check.CT Tools u o Y Exception C r e d o R u n t i m e 32 Grundlage: PatternTesting Runtime (patterntesting-rt.jar) Diese Bibliothek kann auch als reine Java-Bibliothek eingesetzt werden. Sie enthält u.a. den ClasspathMonitor und sämtliche Annotationen, die von den restlichen „Säulen“ verwendet werden. Die restlichen Bibliotheken sind so aufgebaut, dass sie jederzeit wieder ausgeblendet werden können - entweder zur Comile-Zeit oder zur Lauf-Zeit. how it works... Hello.java public class Hello { Aspects (PatternTesting) ... } WEAVING (AspectJ) Hello.class http://www.flickr.com/photos/joathina/113343993/ Donnerstag, 28. Januar 2010 Wir haben: • unsere Java-Sourcen (Hello.java) • Aspekte (in Form der PatternTesting-Lib Wir erhalten: • beides zusammen in Hello.class • durch den AspectJ-Compiler Dieser Übersetzungsvorgang durch AspectJ wird auch als „Weaving“ bezeichnet. Intern verwendet AspectJ dabei den Java-Compiler, d.h. wir erhalten 100% Pure-Java-Classfiles. 33 @NullArgsAllowed Donnerstag, 28. Januar 2010 Überprüfungen werden über Annotationen gesteuert, wie z.B. @NullArgsAllowed. Mit dieser Annotation kann z.B. die Überprüfung der Argumente auf „nicht Null“ (PatternTesting Check.RT) deaktiviert werden. 34 @NullArgsAllowed @MayReturnNull Donnerstag, 28. Januar 2010 @MayReturnNull: Abschaltung der Überprüfung des Rückgabewerts 35 @NullArgsAllowed @MayReturnNull @TestException Donnerstag, 28. Januar 2010 @TestException: Damit können Methoden markiert werden, die im Testfall eine Exception werfen sollen. 36 @NullArgsAllowed @MayReturnNull @TestException @Deprecated @NotYetImplemented @PublicForTesting @TestThread @ProfileMe Donnerstag, 28. Januar 2010 ...und jede Menge weiterer Annotationen 37 Co Co nne nn ctE ec x tio ce p n r tio ef u n: se d Donnerstag, 28. Januar 2010 Dies ist die Standard-Ausgabe der ConnectException. Problem: enthält keine Angabe über Host und Port http://www.flickr.com/photos/pagedooley/958854135/ socket = new Socket(host, port); 38 Co n n C on ec n tio ect n t Ex o b ce p nd tio :81 n: 5r efu se d Donnerstag, 28. Januar 2010 Die gleiche Exception, wenn PatternTesting Exception eingesetzt wird. PatternTesting Exception „wrappt“ einige aussage-arme Exception und reichert sie um hilfreiche Informationen an. http://www.flickr.com/photos/pagedooley/958854135/ socket = new Socket(host, port); 39 Begrüßung Pattern Testing Ausblick Text Pleiten, Pech, ... NPE Einbindung Testing Pattern Testing-xx Quelle: http://de.wikipedia.org/w/index.php?title=Datei:Karte_Cook_Seereise_nr1.png Donnerstag, 28. Januar 2010 Nach „Pattern“ liegt jetzt der Schwerpunkt auf „Testing“... 40 @RunTestsParallel http://www.flickr.com/photos/lembagg/2541715558/ Donnerstag, 28. Januar 2010 @RunTestsParallel: JUnit-Tests werden parallelisiert (PatternTesting Concurrent). Wird eine Klasse damit gekennzeichnet, werden bei der Instanziierung dieser Test-Klasse sämtliche Test-Methoden parallel gestartet. Voraussetzung: Test-Methoden sind unabhängig voneinander (aber das sollten sie sowieso sein) 41 Donnerstag, 28. Januar 2010 Wie testet man die Fehlerbehandlung der Fehlerbehandlung? Wie testet man, wie eine Anwendung auf eine „unerwartete“ Exception reagiert? 42 @ Te s t E x c e p t i o n Exception Factory http://www.flickr.com/photos/extranoise/278465198/ Donnerstag, 28. Januar 2010 Exceptions können zur Laufzeit provoziert werden. Aber nur, wenn die JavaVM mit „ea“ (enable asserts) aufgerufen wurde. Damit kann z.B. getestet werden, wie meine WebAnwendung reagiert, wenn plötzlich eine SocketException geworfen wird. Um die ExceptionFactory zu aktivieren, muss sie lediglich instanziiert werden: ExceptionFactory.getInstance(); // alternativ: ExceptionFactory.registerAsMBean() Dann kann sie über JMX und z.B. die jconsole angesprochen werden. 43 @PublicForTesting Donnerstag, 28. Januar 2010 Haben Sie Methoden, die nur deswegen öffentlich sind, weil sie für‘s Testen gebraucht werden? Damit können Sie verhindern, dass sie von anderen Test-Methoden „missbraucht“ werden. 44 @Deprecated Donnerstag, 28. Januar 2010 Wurde eine Methode aufgerufen, die „@Deprecated“ ist? Falls ja, wird eine DeprecatedCodeException geworfen (wenn Assertions enabled sind). 45 1.0 @RunTestOn("Mac OS X") 1.0 @SkipTestOn("Linux") Donnerstag, 28. Januar 2010 46 Man sollte stets versuchen, seine Tests so zu schreiben, dass sie plattform-unabhängig sind. Allerdings gibt es manchmal auch Situation, wo man sich dabei einen abbricht. Daher kann man den Test nur für bestimmte Betriebssysteme aktivieren (@RunTestOn) oder deaktivieren (@SkipTestOn). Das Ganze kann man auch noch mit arch=“x86_64“ und version=“2.6.12“ kombinieren, um Tests von ganz bestimmten Plattformen auszuschließen. Beide Annotatations sind erst ab PatternTesting 1.0.0 verfügbar. http://www.flickr.com/photos/maerten/370141331/ @Broken Donnerstag, 28. Januar 2010 Haben Sie einen JUnit-Test, der plötzlich fehlschlägt und auf die Schnelle nicht repariert werden kann? Markieren Sie ihn als @Broken: • @Broken(since=“15-Jan-2010“) • @Broken(till=“1-Apr-2010“) -> bis dahin sollte er dann behoben sein! • @Broken(os=“Linux“) -> falls der Test nur unter Linux „broken“ ist • @Broken(user=“oliver“) -> oder falls nur der User „oliver“ Probleme mit dem Test hat („os“ und „user“ sind erst ab PatternTesting 1.0.0 verfügbar) 47 java -ea http://www.flickr.com/photos/tannhaeuser/2052450313/ Donnerstag, 28. Januar 2010 Alle Runtime-Checks sind so aufgebaut, dass sie nur aktiv sind, wenn Assertions enabled sind, d.h. die JavaVM muss mit der Option „-ea“ („enable asserts“) gestartet werden. 48 Demo http://www.flickr.com/photos/libertinus/2847368801/ Donnerstag, 28. Januar 2010 @Broken vorführen patterntesting.samples.Bomb vorführen 49 Begrüßung Pattern Testing Ausblick Text Pleiten, Pech, ... NPE Einbindung Testing Pattern Testing-xx Quelle: http://de.wikipedia.org/w/index.php?title=Datei:Karte_Cook_Seereise_nr1.png Donnerstag, 28. Januar 2010 50 Donnerstag, 28. Januar 2010 aktuelle Version ist 0.9.9, aber das neue Layout von SourceForge sieht etwas unübersichtlicher aus, daher dieser (veraltete) Screenshot. Die PatternTesting-Bibliotheken koennen entweder über SourceForge heruntergeladen werden... 51 <dependency> <groupId>org.patterntesting</groupId> <artifactId>patterntesting-rt</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>net.sf.patterntesting</groupId> <artifactId>patterntesting-rt</artifactId> <version>0.9.9</version> </dependency> Donnerstag, 28. Januar 2010 52 ...oder über Maven eingebunden werden. Aber Achtung: mit 1.0.0 ändert sich die GroupId zu „org.patterntesting“. http://www.flickr.com/photos/m-j-s/2724756177/ Donnerstag, 28. Januar 2010 Empfehlung für PatternTesting: wenn man mit Eclipse arbeitet, sollte auch das AJDT (http:// download.eclipse.org/tools/ajdt/35/update) installiert sein. Wenn man nur den ClasspathMonitor will, kann man zwar darauf verzichten, aber man braucht dann die Runtime-Library von AspectJ (aspectj-rt.jar). 53 Einbindung Light patterntesting-rt.jar ASPECTJRT_LIB (aspectjrt.jar) Donnerstag, 28. Januar 2010 Einbindung UltraLight: •keine AspectJ (aber aspectjrt.jar) •nur patterntesting-rt (im Java Build Path) Für den ClasspathMonitor werden 4 Bibliotheken benötigt: •patterntesting-rt.jar •aspectjrt.jar •commons-lang-2.3.jar •commons-io-1.3.1.jar Unter http://oli.blogger.de gibt es eine Anleitung, wie man eine kleine Demo aufsetzen kann: http://oli.blogger.de/stories/1394945/ bzw. http://oli.blogger.de/static/antville/oli/files/patterntestingeinstieg.pdf 54 PatternTesting Runtime ClasspathMonitor.registerAsMBean(); http://www.flickr.com/photos/mormon_railfan/2615245227/ Donnerstag, 28. Januar 2010 Um ClasspathMonitor zu aktivieren, kann man: ClasspathMonitor.registerAsMBean(); // Registrierung f. JMX ClasspathMonitor.addAsShutdownHook(); // Dump bei Programm-Ende Jetzt kann man den Zug (Programm) starten und am Ende auswerten, welche Strecken (Klassen) nie benutzt wurden. Wenn man es etwas genauer will, kann man zusätzlich noch mit @ProfileMe und der ProfileStatisticMBean tote Bahnhöfe (Methoden) aufspüren => hilft im Kapmpf gegen das Anti-Pattern „Java Flow“ (oder auch „Dead Code“) 55 Normal patterntesting-rt.jar Aspect Path Donnerstag, 28. Januar 2010 Für den normalen Einsatz muss in Eclipse ein AspectJ-Projekt aufgesetzt werden oder ein bestehendes Java-Projekt in ein AspectJ-Projekt gewandelt werden: Convert to AspectJ Project Aspect Path: patterntesting-rt.jar Folgend Annotations werden bereits von PatternTesting Runtime unterstützt: @Broken @NotYetImplemented @UnsupportedOperation @LogThrowable @LogRuntimeException @ProfileMe • • • • • • • • 56 • Test-Version • • Donnerstag, 28. Januar 2010 AspectJ • • patterntesting-rt.jar • u.a. patterntestingcheck-rt.jar ★Release-Version • • • Pure Java patterntesting-rt.jar andere Libs andere Libs 57 Vorsichtige Entwickler können ohne Weiteres auch zwei Versionen bauen: • eine Test-Version, die mit AspectJ (z.B. aus Eclipse) gebaut wird und die entsprechenden PatternTesting-Bibliotheken einbindet • eine reine Java-Version, die nur die patterntesting-rt.jar im normalen Java-Lib-Path enthält (und die z.B. mit Maven gebaut wird) @Broken @NullArgsAllowed @MayReturnNull @RunTestsParallel @LogRuntimeException @NotYetImplemented @PublicForTesting @TestException @TestThread @ProfileMe Donnerstag, 28. Januar 2010 In patterntesting-rt.jar befinden sich sämtliche Annotationen, die auch von den anderen PatternTesting-Teile verwendet werden. Wird patterntesting-rt.jar als reine Java-Bibliothek eingesetzt, haben diese Annotation allerdings nur dokumentarischen Character. 58 PatternTesting Samples „Example isn't another way to teach, it is the only way to teach.“ Albert Einstein http://www.flickr.com/photos/rcsj/2915797223/ Donnerstag, 28. Januar 2010 59 Neben der (im Aufbau befindlichen) Dokumentation gibt es noch PatternTesting Samples, das zwei Aufgaben erfüllt: • Ergänzung zur Dokumentation • zum Testen von PatternTesting selbst Daneben dient es auch als „Spiel“-Projekt, um Neues auszuprobieren (z.B. ausführbare WarDatei mit integriertem Jetty). Begrüßung Pattern Testing Ausblick Text Pleiten, Pech, ... NPE Einbindung Testing Pattern Testing-xx Quelle: http://de.wikipedia.org/w/index.php?title=Datei:Karte_Cook_Seereise_nr1.png Donnerstag, 28. Januar 2010 60 Rückblick ???? ?????? ??? gdv.xport Donnerstag, 28. Januar 2010 PatternTesting wird bereits in mehreren Projekten (direkt oder indirekt) eingesetzt: • Projekt „Blackbox“ für giropay (see http://www.agentes.de/index.php?id=blackbox ) • gdv.xport (see http://labs.agentes.de/gdv.xport/) • und Andere (???...), die ungenannt bleiben wollen (Indirekt bedeutet, dass Ideen und Code von PatternTesting verwendet und weiterentwickelt wurden und anschließend wieder zurückgeflossen sind) 61 1.0 0.9.9 http://www.flickr.com/photos/jsome1/2226394415/ Donnerstag, 28. Januar 2010 62 Wohin geht die Reise? Für dieses Jahr ist 1.0 geplant, das auf Java 6 und AspectJ 1.6 aufsetzt. Und eine neue Heimat unter http://patterntesting.org bekommt. ‣ Dokumentation ‣ PatternTesting All ‣ Bekanntheitsgrad steigern ‣ @Deprecated http://www.flickr.com/photos/untitlism/2609684221/ Donnerstag, 28. Januar 2010 Hauptbaustellen sind zurzeit noch • Dokumentation (wie in jedem OpenSource-Projekt) • vereinfachter Download, damit man nicht jede Bibliothek einzeln runterladen muss (PatternTesting All) Wer Lust hat, mitzumachen oder einfach nur Anregungen zu geben, ist jederzeit herzlich willkommen und kann mich gerne kontaktieren. Oder Sie posten es in die Mailing-Liste. Auch wenn Sie Fragen oder Probleme haben - melden Sie sich einfach. 63 V e h T i s i n o Donnerstag, 28. Januar 2010 In Minesweeper geht es darum, anhand der Hinweise durch den Computer die Minen auf einem Spielfeld zu finden. „Tritt“ man aus Versehen auf eine - Game Over! 64 To be the Minesweeper for Your Java Code! http://www.flickr.com/photos/neodelphi/1707209395/ Donnerstag, 28. Januar 2010 PatternTesting hilft, Minen im Code zu finden... Bildquelle: http://www.flickr.com/photos/neodelphi/1707209395/ 65 a() b() Donnerstag, 28. Januar 2010 Game over! ENDE findbugs() 66 Fragen? Fragen! [email protected] http://oli.blogger.de http://PatternTesting.org Donnerstag, 28. Januar 2010 Werfen Sie einen Blick auf http://patterntesting.org und kontaktieren Sie mich oder (besser) die Mailing-Liste, wenn Sie Fragen oder Anregungen haben. Happy PatternTesting! 67