codecentric

Automatisierte Akzeptanz-Tests mit Concordion

Im Open Source Bereich gibt es mittlerweile eine Vielzahl von Werkzeugen für die Automatisierung von Akzeptanz-Tests. Dabei gibt es eine Vielzahl verschiedener Konzepte. Das Robot Framework setzt z.B. auf keyword-getriebene Testentwicklung und bietet eine Vielzahl an Werkzeugen und Test-Bibliotheken. FitNesse wiederum organisiert Testfälle in einem eigenen Wiki und bietet die Möglichkeit, Tests direkt aus diesem zu starten. In eine andere Richtung geht JBehave, welches konsequent auf Testbeschreibungen im BDD-Format setzt. Die Testimplementierung erfolgt vollständig in Java. Auf JBehave haben wir hier bereits einen ausführlichen Blick geworfen.

Bei vielen Diskussionen rund um Agile Test-Werkzeuge wird früher oder später Concordion – im allgemeinen positiv – erwähnt. Dabei habe ich allerdings noch niemanden kennen gelernt, der es wirklich produktiv einsetzt. Es ist also höchste Zeit sich ein eigenes Bild zu machen :) .

(weiterlesen …)

Thomas Jaspers

 

Spring Data – Teil 2: JPA

Was bisher geschah

Teil 1: Spring Data Commons
Teil 2: Spring Data JPA

Nachdem wir im ersten Teil dieser Blog-Serie das Spring Data Commons Projekt vorgestellt haben, wollen wir nun das Unterprojekt Spring Data JPA genauer unter die Lupe nehmen.

JPA

JPA ist als Teil des JEE-Stacks eine standardisierte Schnittstelle, mit der POJOs in relationalen Datenbanksystemen persistiert werden können. Mit einer eigenen Abfragesprache JPQL können Datenbankabfragen unabhängig von einem konkreten SQL-Dialekt formuliert werden. Für das Verständnis von Spring Data JPA sollten daher zumindest Grundkenntnisse des JPA APIs vorhanden sein.

Spring Data JPA

Aufbauend auf dem klassischen JPA Support bietet Spring Data JPA (u.a.) ein Konzept, mit dem JPQL-Queries wesentlich einfacher implementiert werden können. Üblicherweise sind Queries parametrisiert. Vor der Ausführung einer Query schreibt der Entwickler meistens eine Menge Boilerplate-Code, um diese Parameter zu setzen. Das wird dann klassich in einem Spring-Repository in etwa so implementiert:
(weiterlesen …)

Tobias Trelle

 

Eine Fachkomponentenarchitektur mit Spring 3.0/3.1 – Teil 3: Properties

Nach der grundsätzlichen Struktur und den Ressourcen behandle ich nun im dritten Blogpost dieser Reihe das Thema Properties. Dieses mag erst einmal einfach erscheinen, Entwickler mit Spring-Background werden schnell auf den PropertyPlaceHolderConfigurer verweisen und die Sache abhaken, und doch – in dem beschriebenen Umfeld (> 100 Entwickler, viele verschiedene Abteilungen, beliebige Anwendungen können beliebige Fachkomponenten verwenden) gibt es einige Aspekte, die das Ganze verkomplizieren.

Was sind Properties?

Aber treten wir doch mal einen Schritt zurück und schauen uns an, was Properties überhaupt sind. Properties werden dazu verwendet, Konfigurationswerte aus der Anwendung auszulagern, die später durch einen wie auch immer gearteten Außenstehenden gesetzt werden. Dabei gibt es zwei Gruppen von Properties:

  • Properties, die das Anwendungsverhalten bestimmen, unterschiedliche Modi und Ähnliches (Kategorie A).
  • Properties, die Ressourcen konfigurieren, DB-URL, Queue-Namen und Ähnliches (Kategorie B).

Properties sind statisch und ändern sich zur Laufzeit der Anwendung nicht. Für Werte, die dynamisch während der Laufzeit geändert werden müssen, bieten sich andere Konzepte an (Datenbank, JMX).

Das Auslesen von Properties ist Infrastrukturcode und sollte deshalb nicht mit Businesslogik vermischt werden. Im Kontext der Fachkomponentenarchitektur bedeutet das, dass Properties immer im Konfigurationsprojekt ausgelesen und dann per Dependency Injection in den Businesskomponenten gesetzt werden. Ein Beispiel zeigt wahrscheinlich am deutlichsten, wie das gemeint ist.
(weiterlesen …)

Tobias Flohre

 

Java Memory Leaks zur Laufzeit aufspüren (5. Akt)

Der Akt 4 unserer Serie über OutOfMemoryError schloss mit dem Ausblick auf bessere Verfahren zum Aufspüren von Memory Leaks. Wir haben beschrieben, dass man in HeapDumps zwar große Objekte finden kann, die Aussagekraft über Leaks aber oft nur dann hoch ist, wenn ein OutOfMemoryError aufgetreten ist. Um dann in einer post-mortem Analyse etwas finden zu können sollte unbedingt der Parameter -XX:+HeapDumpOnOutOfMemoryError verwendet werden.

Doch dieses Verfahren ist nicht immer gut geeignet um Memory Leaks zu finden. Zum einen muss man warten bis ein Fehler auftritt, zum anderen führt ein sehr langsam wachsendes Memory Leak vielleicht garnicht zu einem OutOfMemoryError, weil die Server, und damit die JVMs, sowieso regelmäßig für Deployments oder gerade zur Bekämpfung von Speicherproblemen neu gestartet werden.

Das Verfahren solche “schleichenden” Memory Leaks zu finden ist deutlich komplizierter und aufwändiger als eine post-mortem Analyse. Mittels mehrerer, zeitlich versetzten, Dumps ist es zwar möglich wachsende Strukturen über Zeit zur erkennen, in der Praxis ist dies aber häufig sehr mühselig und oft kaum informativer als einzelne Dumps, da die Vielzahl von normalen Schwankungen zwischen Dumps die wirklich interessanten Delta doch deutlich überlagert. Zudem muss man zur Analyse auch die das Memory Leak verursachenden Use Cases kennen, um das Problem gezielt nachstellen zu können. Ferner ist es in Produktion zudem fast unmöglich einen vollen Heapdump zu ziehen, da das System, je nach Heap Größe, mehrere Sekunden bis Minuten still steht.

Besser ist es zur Laufzeit des Programms den Heap und die darin enthaltenen relevanten Objekte dauerhaft zu überwachen. So kann herausgefunden werden welche Objektstrukturen über eine längere Zeit weiter wachsen. Und da das Programm ja noch läuft, kann ferner auch ermittelt werden welcher Code mit dieser Objektstruktur interagiert. Dies ist mit HeapDumps nicht möglich, da keinerlei Codeinformationen enthalten sind.

(weiterlesen …)

Fabian Lange

 

Hochskalierbare Cloud-Architekturen

Auf der W-JAX 2011 haben mein Kollege Patrick Peschlow und ich über hochskalierbare Cloud-Architekturen gesprochen. Der Ausgangspunkt dafür war ein konkretes Cloud-Projekt, in dem es um ein praktisch beliebig skalierbares Cloud-SaaS-Angebot ging. In dem Vortrag geht es um typische Aufgaben und Fallstricke aus Architektursicht sowie eine ganze Reihe praktischer Erfahrungen, die wir in dem Zusammenhang gemacht haben. (weiterlesen …)

Uwe Friedrichsen

 

Die besten Entwicklungstools in der Cloud

Wir haben uns bei codecentric schon vor ein paar Jahren entschieden möglichst viele Dienste in die Cloud zu verlagern. Google Apps war ein erster Schritt bei uns, um den eigenen Exchange Server abzulösen. Die Frage die sich irgendwann in diesem Prozess gestellt hat ist, wie es mit Cloud Diensten für die Software Entwicklungsumgebung, also Entwicklungswerkzeuge und -infrastruktur, aus der Cloud aussieht? Mit diesem Artikel möchte ich einen Überblick über verfügbare Entwicklungstools als Software as a Service (SAAS) oder Platform as a Service (PAAS) geben und diese beschreiben. Natürlich ist das nur ein kleiner Ausschnitt der verfügbaren Tools, aber aus meiner Sicht sicherlich eine Auflistung der besten verfügbaren Werkzeuge – insbesondere wenn man wie wir mit agilen Methoden und Praktiken entwickelt.

Gerne würde ich aber Euer Feedback und Eure Erfahrung dazu hören, denn der Markt entwickelt sich sehr schnell und es ist kaum möglich alle Werkzeuge im Blick zu haben.

Source Verwaltung – GitHub

Eine der wichtigsten Werkzeuge für den Entwickler ist eine Versionskontrolle für Sourcen, Dokumente und andere Artefakte in der Entwicklung. Nach CVS, Subversion und Co haben sich mittlerweile Distributed Version Control Systeme (DVCS) durchgesetzt. Git und Mercurial haben sich hier etabliert. Mit GitHub gibt es eine Plattform, die Git aus der Cloud bereitstellt. Immer mehr OpenSource Projekte, aber auch Firmen stellen auf diese Plattform um – mittlerweile verwaltet GitHub mehr als 3.500.000 Projekte. Es gibt auch eine Enterprise Version für die unternehmensinterne Installation, was aus rechtlichen Gründen interessant sein kann. GitHub ist sehr einfach und intuitiv zu bedienen. Projekte lassen sich leicht anlegen oder clonen, d.h. man kann beispielsweise mit einem Klick eine lokale Kopie des Springframeworks anlegen. Neben den Versionskontrollfunktionen gibt es aber auch noch ein Wiki, ein einfaches Bugtracking Werkzeug und ein Collaborations Werkzeug für die Durchführung von Code Reviews – insbesondere letzteres ist ein echter Mehrwert in Projekten.

(weiterlesen …)

Mirko Novakovic