Nachlese: Generatives Testen in Clojure | Print |
Written by Philip Höfges   
Tuesday, 24 February 2015 12:26

Auch zum ersten Rheinjug-Vortrag im neuen Jahr haben sich etwa 60 Menschen im Hörsaal eingefunden, trotz eines kurzfristigen Redner- und Themenwechsels. Mit dem neuen Thema „Generatives Testen in Clojure“ stellt der Redner Jens Bendisposto sein persönliches Steckenpferd vor. Er hat am Lehrstuhl für Softwaretechnik und Programmiersprachen an der HHU promoviert und ist begeisterter Clojure-Nutzer.

Jens beginnt seinen Vortrag mit einer kurzen Einführung in die Sprache Clojure. Clojure ist ein LISP und gehört in die Kategorie der funktionalen Programmiersprachen. Wie viele andere Programmiersprachen auch, hat Clojure die klassichen Basisdatentypen, Integer und Strings, sowie einige Spezielle, nämlich Keywords und Symbole. Diese fungieren vor allem als Wiedererkennung. Zu dem gibt es in Clojure einige zusammengesetzte Datentypen: Vektoren, Listen, Sets und Maps. Diese unterscheiden sich nur wenig. Sets können beispielsweise keine doppelten Einträge enthalten, während Maps (ähnlich wie die HashMaps in Java) von einem Schlüssel auf einen Wert abbilden. Dabei können hier die Einträge bzw. Schlüssel und Werte jeweils jeder Basisdatentypen sein. Man kann alles frei vermischen und verschachteln. Mehr gibt es zur Grundsyntax nicht zu sagen. Damit kann man bereits alles in Clojure machen, behauptet Jens Bendisposto. Interessanter wird es natürlich bei Funktionen und deren Calls. Ein sehr gutes Feature von Clojure ist die Kompatiblität mit Java. Man kann jede Java-Funktion in Clojure importieren und benutzen. Dabei muss natürlich auf die Infix-Notation geachtet werden. Hier stellt der Redner einen schönen Vergleich an: Es wurde immer behauptet, dass Clojure sehr viele Klammern benutzen würde. Dies stimmt auch, aber Jens Bendisposto zeigt, dass es bei Java noch viel mehr sein können. Mit Hilfe der zwei wichtigten Clojure-Funktionen Map und Reduce zeigt der Redner, wie einfach man auch Funktionen als Parameter und Rückgabewert benutzen kann. Dies macht die Sprache sehr flexibel. Damit beendet Jens die Einführung in die Sprache Clojure.

Im zweiten Teil des Vortrags kommt Jens Bendisposto auf das eigentliche Thema zu sprechen: Testen. Die Basis von Tests in Clojure sind einfache Vergleiche zwischen dem Ergebnis einer Berechnung und deren erwartetes Ergebnis. Dies sind die Unit-Tests. Man kann einzelne Tests durchführen, aber auch mehrere Tests in einen Test-Case integrieren. Dies setzt natürlich voraus, dass das Ergebnis bekannt ist. Man muss sich also für jede einzelne Berechnung das Ergebnis überlegen. Dies ist natürlich sehr umständlich und deckt auch nicht jeden Randfall ab.

Um viele Tests schnell und übersichtlich zu lösen, wurde das generative Testen entwickelt. Dabei erzeugen so genannten „Generatoren“ zufällige Werte, die dann in die Tests integriert werden können. So können kontrolliert Zahlen, String, boolsche Werte uvm. erzeugt werden. Mit diese können dann die Tests bearbeitet werden. Dadurch ist es möglich, eine Vielzahl von Tests durchzuführen, ohne sich im Vorhein viele Gedanke darüber machen zu müssen. Weiterhin bietet diese Art von Tests in Clojure eine sehr übersichtliche Ausgabe, sollten die Tests fehlschlagen. Man sieht genau, welche Tests jeweils das Problem erzeugen. Vor allem interessant ist die Berechnung des Minimums, bei dem der Test nach wie vor fehlschlägt. Das heißt, dass man sehr genau sehen kann, welches Teilbereich das Problem erzeugt und kann diesen damit effizient beheben. Für diese Tests sind Monotonie und Persistenz sehr wichtig. Um dies zu beweisen, zeigt Jens Bendisposto die Arbeitsweise der Funktion apply. Mit ihr können Funktionen auf beispielsweise Listen und Vektoren angewendet werden. Dies gestattet die Benutzung von so genannten „Quick-Checks“. Hier werden die Generatoren dazu genutzt, eine Vielzahl von automatischen Tests zu erzeugen. Hier kann man die Monotonie der Werte jeweils sehr schön sehen. Bleibt noch, die Persistenz zu beweisen. Um die Performance zu verbessern, wird das Schlüsselwort transient benutzt. Dieses Kontrukt ist jedoch veraltet und wird heutzutage kaum noch eingesetzt. Allerdings wird es hier noch benötigt, um die Persistenz zu zeigen. Wenn eine Funktion mit und ohne diese Optimierung das gleiche Ergebnis liefert, sind die Daten immer korrekt.

Zum Abschluss zeigt Jens noch ein bemerkenswertes Beispiel eines Bugs, welcher mit Hilfe des generativen Testens gefunden worden ist. Zwei Berechnung liefern das selbe Ergebnis. Dennoch schlagen die Tests fehl. Wie kommt es? Durch generatives Testen wurde dieser Fehler zufällig gefunden und konnte behoben werden. Diesen per Hand zu finden, erklärt Jens sowohl mit Clojure, als auch mit Java für unmöglich. Findet allgemeine Zustimmung.

Das Fazit des Tages: Generatives Testen in Kombination mit Unit-Tests ist eine sinnvollen und sehr nützliche Sache!

 
In eigener Sache (Umfrage) | Print |
Written by Lukas Ladenberger   
Tuesday, 17 February 2015 08:49

Wir sind daran interessiert mehr über die Besucher unserer Veranstaltungen und ihre Interessen zu erfahren. So können wir noch besser auf eure Wünsche für Vortragsthemen und -formate eingehen. Daher führen wir derzeit eine Umfrage unter http://de.surveymonkey.com/s/LKHTQTL durch. Wir würden uns über zahlreiche Stimmabgabe freuen. Die Umfrage läuft voraussichtlich bis zum 26.02.2015.

 
rheinjug sagt DANKE! | Print |
Written by Lukas Ladenberger   
Friday, 19 December 2014 10:00

2014 neigt sich dem Ende zu und die rheinjug kann auf ein erfolgreiches Jahr zurückblicken. Unmittelbar zu Beginn des Jahres durfte die rheinjug gemeinsam mit über 200 Besuchern und einem interessanten Vortrag von Dalibor Topic, das Release von Java 8 feiern. Gleich zwei Monate später, im Mai, konnte die rheinjug Gernot Starke mit einen spannenden Vortrag zum Thema Softwarearchitektur begrüßen. Aber auch aktuelle Themen wie Docker, Microservices, Profiling und zuletzt AngularJS prägten das Jahr 2014.

Und auch für das Jahr 2015 haben wir viel geplant: Wir wollen wieder an das Jahr 2014 anknüpfen und mindestens neun Vorträge anbieten. Weiterhin werden wir mit neuen Inhalten und Formaten experimentieren. Bleibt gespannt! Der nächste Vortrag wird voraussichtlich im Februar 2015 stattfinden. Wir halten euch auf dem Laufenden!

An dieser Stelle möchten wir uns auch nochmal ganz herzlich bei allen Helfern und Teilnehmern bedanken. Ein besonderer Dank gilt auch unserem Goldsponsor Amadeus FiRe und unseren Silbersponsoren YourKit, ABIT und ecx.io. All dies wäre ohne die Unterstützung unserer Sponsoren so nicht möglich.

Wir wünschen schöne Weihnachtsfesttage und einen guten Rutsch ins neue Jahr!

Eurer rheinjug Team!

 
ACHTUNG Vortragswechsel: Generatives Testen in Clojure (Jens Bendisposto) | Print |
Written by Lukas Ladenberger   
Thursday, 19 February 2015 11:27

Liebe Freunde der rheinjug,

Viele Dinge können wir beeinflussen, aber nicht die Gesundheit unserer Sprecher. Leider hat heute Morgen Philip Hagemeister absagen müssen, da ihn die Grippewelle voll erwischt hat. Das ist eben höhere Gewalt.

Wir haben jedoch für euch alle Hebel in Bewegung gesetzt und trotz der kurzen Vorlaufzeit Jens Bendisposto rekrutieren können. Das Thema hat sich natürlich geändert, und wir freuen uns auf

Generatives Testen in Clojure

Testen ist eines der am häufigsten eingesetzten Mittel zur Steigerung der Qualität eines Softwaresystems. In der Regel benutzt man beispielbasierte Tests: Es wird eine Eingabe festgelegt und die Ausgabe der Software mit einem erwarteten Wert verglichen. Die Krux bei diesem Vorgehen ist das Finden relevanter Eingaben. Ich werde im Vortrag zeigen, wie generatives Testen helfen kann. Generatives Testen ist sehr populär in funktionalen Spachen wie Haskell, Erlang oder Clojure. Ich werde auch eine Kurzeinführung in Clojure geben.

Jens Bendisposto hat am Lehrstuhl für Softwaretechnik und Programmiersprachen promoviert. Er beschäftigt sich mit sicherheitskritischen Systemen und funktionaler Programmierung in Clojure.

Wir hoffen, Ihr habt Verständnis für die kurzfristige Vortragsänderung und hoffen, dass Ihr trotzdem heute Abend viel Spaß haben werdet.

 
Nachlese: AngularJS | Print |
Written by Philip Höfges   
Friday, 19 December 2014 11:05

>> Slides

>> Video

Bald ist Weihnachten und das darf auch bei der Rheinjug nicht fehlen. Bei diesem letzten Vortrag des Jahres 2014 werden neben den üblichen Subs auch weihnachtliche Plätzchen gereicht. Schon im Vorfeld wird klar, dass die weihnachtliche Stimmung auch auf den Vortrag übergehen wird. Wieder finden sich etwa 90 Zuschauer im Hörsaal ein. Dieses mal wird ein Vortrag von zwei Rednern gehalten. Philipp Tarasiewicz und Robin Böhm sind Softwareentwickler und Coaches, die mit ihrer eigenen Firma sich vor allem mit dem heutigen Thema beschäftigen: AngularJS.

Zunächst erzählen die beiden Redner ein wenig über sich und werben nebenbei für ein Buch zum Thema, welches sie selbst mit verfasst haben. Der erste Teil des Vortrags wird von Philipp Tarasiewicz gehalten. Er stellt mit einer Einleitung AngularJS dar. Natürlich beginnt er mit der Nennung der Haupteigenschaften des Frameworks für JavaScript: Mit dem Two-Way Data Binding schafft es AngularJS, die Web-Applikation ständig zu aktualisieren, sofern es nötig ist, also tatsächlich nur dann, wenn wichtige Änderungen durchgeführt worden sind. Um dies zu veranschaulichen, zeigt Philipp ein kleines Beispiel. Daran kann sehr schön abgelesen werden, dass sich Two-Way Binding lohnt. Damit ist AngularJS sowohl MVVM (kurz für Modelview View Model), als auch MVW (kurz für Modelview Whatever). Es kann also in vielerlei Hinsicht dargestellt werden und ist somit sehr flexibel. Weiterhin stellt der Redner fest, dass die Lesbarkeit sehr hoch ist. Dies will er in einer Live-Coding-Session am Ende seines Abschnitts zeigen. Ein weitere wichtiger Punkt sind die Direktiven. Man hat damit die Möglichkeit, DOM-Manipulation tatsächlich nur in diesen Direktiven auszuführen und läuft nicht Gefahr, dass solche Manipulationen von anderer Stelle das Programm beeinflussen. Zudem kann man mit AngularJS mehr aus seinem HTML Tags und Attributen machen, wie Philipp am Ende zeigen will. Zuletzt ist noch Dependency Injection ein wichtiges Thema. Es ist schwierig, die Abhängigkeiten gut darzustellen, obwohl sie wichtig für das Konzept von AngularJS sind. Alles muss in einem Modul deklariert werden, was natürlich Abhängigkeiten hervorruft.

Am Ende zeigt Philip noch ein ausführliches Beispiel in einer Live-Coding-Session. Er zeigt, wie man einen ColorPicker in sehr kurzer Zeit, sehr effizient entwickeln kann. Zunächst wird eine direkte Verbindung von einem Textfeld zu einer Überschrift hergestellt. Und das Ganze live. Es muss nichts kompiliert werden, der Text erscheint sofort in der Überschrift. Schöne Sache. Mit diesem einfachen Trick können auch Schieberegler direkten Einfluss auf die App nehmen. Was am Ende dabei heraus kommt ist ein Feld, welches live die Farbe ändern kann. Und das mit diesem einen, einfachen Trick. Schöne Sache. Zuletzt zeigt Philipp noch, wie man aus diesem Code eine Direktive erzeugt und damit mehrere ColorPicker gleichzeitig anzeigen lassen kann, ohne den Code duplizieren zu müssen. Auch hier: Schöne Sache.

Danach darf auch Robin Böhm endlich zu Wort kommen. In seinem Abschnitt des Vortrags geht es um TDD (Test Driven Development). TDD stellt eines der wesentlichen Features von AngularJS dar. Hier kann man sich nach Herzenslust austoben. Es gibt ein Framework für E2E (End-To-End) Testing, Unit Testing mit Hilfe von Jasmine und Test Runner wie Karma. Nun behauptet Robin, dass jede Komponente unit-testbar sei und beweist dies, in dem er auf seinen Folien einige Beispiele zeigt. Da inzwischen das manuelle Kontrollieren des Codes mehr als veraltet ist, wird TDD immer wichtiger in der Softwareentwicklung. Außerdem können Tests als Gedächtnisstütze eingesetzt werden. Wenn man montags morgens ins Büro kommt, kann man anhand der Tests sehr schnell nachvollziehen, was man eigentlich in der letzten Woche so alles getrieben hat. Als nächstes erklärt Robin das Tool Jasmine. Die Methoden und Funktionen, die Jasmine bietet, liefern eine hervorragende Basis für Tests. Es werden Ausgaben mit erwarteten Ergebnissen verglichen. Vergleiche sind hierbei unter Anderem Gleichheit und Identität. Somit kann ein Testvorgang mit Jasmine leicht nachvollzogen werden. Im nächsten Schritt zeigt der Redner, wie man HTML-Templates leicht mit Direktiven ausstatten kann und damit auch Fehler in Browsern finden kann, die nicht von einem selbst stammen.

Abschließend zeigt Robin ebenfalls Live-Coding. Er erzeugt einen Würfel, der in alle drei Dimensionen drehbar ist. Schöne Sache. Jedes Element des Würfels, also Kanten und Flächen, sind nichts weiter als div-Elemente. Da jedes Element auch für sich selbst steht, kann man sie einzeln testen. Vom Grundaufbau her sieht der Code dem vom vorherigen Beispiel mit dem ColorPicker sehr ähnlich. Was natürlich mehr interessiert in diesem Kapitel sind die Tests. Diese sind schlicht einfache Vergleich nach Gleichheit etc. bei Jasmine. Damit zeigt Robin, dass man testgetriebene Entwicklung mit AngularJS sehr gut umsetzen kann.

Zum Schluss verlosen die beiden noch einige Exemplare ihres Buches, indem sie dem Publikum fragen zu ihrem Vortrag stellen. Eine gute Methode, die Aufmerksamkeit zu überprüfen. Bleibt am Ende nur zu sagen: Frohes Fest und einen guten Rutsch!

 
<< Start < Prev 1 2 3 4 5 6 7 8 9 10 Next > End >>

Page 4 of 14