Archiv

Archive for November 2009

Testen von Exceptions mit JMockit

23. November 2009 1 Kommentar

Für einen Unit-Test benötigt man meistens nur gewisse Teile eines “fremden” Objekts. Oft genügt einem eine fixe Anzahl definierter Rückgabewerte. Statt das man nun das “fremde” Objekt erzeugt und die Werte aus einer Datenbank holt, setzt man eine Testattrappe ein. Diese Attrappe liefert einem die definierten Rückgabewerte oder Exceptions, ohne dabei wirklich mit der Datenbank, dem Dateisystem oder dem Netzwerk zu sprechen. So eine Attrappe kann ein Mock oder Stub sein.

JMockit ist ein Framework für Java, das einem bei der Erstellung von Mocks und Stubs hilft. Für Java gibt es zahlreiche solcher Frameworks. JMockit hat aber einige besondere Fähigkeiten, was das Testen deutlich erleichtern kann.

Für AtaraxiS war ich in den letzten Tagen am erweitern der Unit-Tests. Die Testabdeckung war noch nicht überall so gut, wie ich diese haben will. Es fehlten vor allem noch die zahlreichen Catch-Blocke für die Exceptions.
(Wieso überhaupt Exceptions testen? AtaraxiS will die Verschlüsselung abstrahieren und reduziert die dabei möglichen Exceptions auf eine handlichere Anzahl. Diese Tests dienen der Kontrolle, ob auch nach dem anstehenden Umbau noch alles wie gewohnt läuft.)

	public ACDecryptInputStream (File inFile, SecretKey aesKey) throws IOException
	{
		try 
		{
			// Parse the Header of the File
			AtaraxisHeaderParser ahParser = new AtaraxisHeaderParser(inFile);

			// When it contains a Header, then prepare all for CBC-Mode
			IvParameterSpec ivSpec = new IvParameterSpec(ahParser.getIV());

			fis = new FileInputStream(inFile);
			fis.skip(ahParser.bytesToSkip());

			cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
			cipher.init(Cipher.DECRYPT_MODE, aesKey, ivSpec);
			
			// Create the CipherInputStream
			decryptedInputStream = new CipherInputStream(fis, cipher);
		} 
		catch (NoSuchAlgorithmException e)
		{
			LOGGER.error("NoSuchAlgorithmException", e);
			throw new IOException("NoSuchAlgorithmException");
		} 
		.....
	}

Um dies zu testen, müsste die Klasse Cipher bei getInstance() eine NoSuchAlgorithmException werfen. Dies könnte ich durch eine Abstraktionsschicht zwischen unserem Code und dem von BouncyCastle machen. Das bedingt aber eine Änderung am Code. Hier wäre das zwar möglich, doch geht das nicht immer.

JMockit hat dafür eine passende Methode. Mittels Mockit.redefineMethods() kann eine Methode umgeleitet werden. Das angegebene Ziel kann genau das machen, was man von ihm erwartet. Um die Exception zu werfen, dient dieser Aufruf:

	@Test(expected=IOException.class)
	public void ACDecryptInputStream_NoSuchAlgorithmException() throws Exception
	{
		Mockit.redefineMethods(javax.crypto.Cipher.class, new Object() {
			@SuppressWarnings("unused")
			public final Cipher getInstance(String transformation,
                    Provider provider)
             throws NoSuchAlgorithmException,
                    NoSuchPaddingException
			{
				throw new NoSuchAlgorithmException();
			}
		});

		ACDecryptInputStream acI = new ACDecryptInputStream(testFile, key);
		fail("IOException missing for " + acI);
	}

Dies ist nur eine der unzähligen Möglichkeiten, die JMockit bietet. Nach dem gleichen Prinzip kann man beliebige Rückgabewerte zurückliefern. Wer mehr dazu wissen will, findet auf der Projektseite von JMockit eine sehr detaillierte Anleitung.

Schlagworte: ,

Buch-Rezension zu “Systemarchitekturen für Verteilte Anwendungen”

19. November 2009 Kommentare aus

Die steigenden Anforderungen an aktuelle Software benötigen entsprechend flexible Lösungen. Herausforderungen wie Skalierbarkeit oder Ausfallsicherheit hofft man mit verteilten Systemen lösen zu können. Doch wo soll man starten? Was für Möglichkeiten gibt es und wie kann man die unzähligen Begriffe und Konzepte einordnen?

Diese und weitere Fragen versucht das Buch “Systemarchitekturen für Verteilte Anwendungen” von Jürgen Dunkel, Andreas Eberhart, Stefan Fischer, Carsten Kleiner und Arne Koschel zu beantworten. Eine kurze Einführung über Software-Architektur und eine Erklärung der grundlegenden Begriffe dient als Start in die Welt der verteilten Anwendungen.

Diese Konzepte werden im 2. Teil vorgestellt:

Um ein Gefühl dafür zu bekommen wird jeweils eine Erklärung des Architekturkonzepts, eine Übersicht zu den Realisierungsplattformen und Code-Beispiele geliefert.

Teil 3 behandelt die Auswahl einer konkreten Architektur. Die im zweiten Teil vorgestellten Konzepte werden wieder aufgenommen und auf die Anforderungen aus dem Softwarelebenszyklus hin untersucht. Dies umfasst die Problemanalyse, das Design, die Implementierung und Test, sowie den Betrieb und die Wartung.
Die Fallbeispiele aus der Praxis reichen vom LAMP-Stack über den PetStore von Java EE bis hin zum Grid des CERN für den LHC (Large Hadron Collider).

Als Abschluss dient ein Ausblick auf Software as a Service (SaaS), Virtualisierung und Cloud Computing.

 
Stärken und Schwächen
Ein so komplexes und grosses Thema auf weniger als 300 Seiten näher zu bringen ist eine grosse Herausforderung. Es gelingt den Autoren einem einen guten Überblick zu verschaffen und hilft dabei, die unzähligen Begriffe einordnen zu können. Die Stärken des Buches liegen eindeutig bei den allgemeinen Erklärungen.

Bei den konkreten technischen Umsetzungen fällt die Qualität aber stark ab. Die Code-Beispiele sollen zeigen wie das Beschriebene konkret umgesetzt wird. Allerdings sind diese viel zu kurz und wenn man sich nicht bereits mit dem Thema auseinander gesetzt hat wird man kaum verstehen, was da nun gezeigt wird. Die Seitenlangen XML-Dokumente helfen da auch nicht weiter.

Die Formatierung ist sehr gewöhnungsbedürftig. Alle Leerzeichen in den Strings werden konsequent markiert – auch dann wenn diese nur zum einrücken dienen und über die halbe Seite gehen. Dafür fehlt bei Befehlszeilen der Hinweis, dass der Zeilenumbruch dem Layout geschuldet ist und man den Befehl als eine Zeile eingeben muss.

Auch sehr gewöhnungsbedürftig ist die Art, wie auf weiterführende Literatur verwiesen wird. Als Beispiel die Einleitung des Architekturkonzepts der Grid Architekturen:

Als Geburtsstunde des Grid Computing wird üblicherweise das Jahr 1998 mit dem Erscheinen des Werkes [25] genannt.

Möchte man wissen welches Buch gemeint ist, bleibt einem nichts anderes übrig als zum Literaturverzeichnis zu blättern. Dies ist leider kein Einzelfall.

Die grosse Anzahl der Autoren bemerkt man bei den Erklärungen der Begriffe. Teilweise wird sehr grosszügig damit umgegangen und dann wiederum werden Abgrenzungen gemacht, die mit der Praxis kaum noch etwas zu tun haben.

Die Fallbeispiele sind eine Enttäuschung. Der LHC an sich ist spannend, doch wer braucht eine vergleichbare Lösung? Und ist die Demo-Applikation PetShop wirklich erwähnenswert? Mehr Beispiele aus der Praxis die einer grösseren Leserschaft bekannt sind (wie Amazon) hätten da besser gepasst.

 
Fazit
Das Buch ist gut geeignet um einen Überblick über das Thema der verteilten Anwendungen zu bekommen. Wer allerdings an der technischen Umsetzung interessiert ist, sollte sich nach einem anderen Buch umschauen.

 
Zum Buch
Systemarchitekturen für Verteilte Anwendungen, von Jürgen Dunkel, Andreas Eberhart, Stefan Fischer, Carsten Kleiner und Arne Koschel, 2008 HANSER, ISBN 978-3-446-41321-4, 293 Seiten

Schlagworte: ,

Buch-Rezension zu “The Art of Unit Testing”

8. November 2009 3 Kommentare

The Art of Unit Testing“The Art of Unit Testing” von Roy Osherove ist im Mai 2009 bei Manning erschienen. Das Buch behandelt Unit Testing in C#.

 
Zum Inhalt
Kapitel 1 zeigt die Basis von Unit Tests. Diese umfasst eine Definition der Begriffe, eine kurze Einführung zu Test-Driven Development (TDD) und eine Abgrenzung gegen Integrationstests. Den nicht alles, was sicht Unit Test nennt, ist auch wirklich einer.

Kapitel 2 hilft einem durch den ersten Unit Test. Nach der Auflistung der Vorteile die ein entsprechendes Test-Framework bringen folgt ein Rundgang durch NUnit. Dieser reicht von der Installation über die Einrichtung eines Test-Projekts zu Namenskonventionen bis hin zur Ausführung der Tests.

Wie man mit Stubs die Abhängigkeiten aufbrechen kann wird in Kapitel 3 gezeigt. Das Beispielprojekt hat zu beginn eine direkte Abhängigkeit zum Dateisystem. In 2 Schritten wird der Code so umgebaut, dass die Abhängigkeit aufgelöst werden kann. Mit einer kleinen Hilfsklasse, dem Stub, kann man dann genau die Antwort zurück liefern, die man für den Test der Übergeordneten Klasse benötigt. Dies kann in dem Beispiel sowohl ein Boolean sein wie auch eine Exception des Dateisystems.
Es folgt ein Abstecher ins Thema Dependency Injection. Denn der Stub, aber auch die konkrete Klasse mit der Logik, muss ja mit der aufrufenden Klasse verbunden werden. Es werden die Vor- und Nachteile der jeweiligen Ansätze dargelegt, damit man selber das zu seinem Problem passende auswählen kann.

Kapitel 4 zeigt wie man mit Mock Objekten die Interaktion mit der zu testenden Klasse prüfen kann. Mit einem selbst geschriebenen Mock wird das Prinzip erklärt, bevor in Kapitel 5 das Mock-Framework Rhino Mocks erklärt wird. Eine Übersicht der anderen verbreiteten Frameworks (wie TypeMock, NMock und NUnit.Mocks) rundet das Kapitel ab.

Die Organisation von Tests, Test Patterns und Continuous Integration bilden das Kapitel 6, während Kapitel 7 die Qualität der Tests behandelt. Lesbarkeit und Verständlichkeit sind Dinge, die auch bei Tests bedacht werden müssen.

Kapitel 8 hilft bei der Integration von Unit Tests in die Firma. Hierbei geht es nicht um die technische, sondern um die organisatorische Ebene. Osherove berichtet über seine Erfahrungen und liefert Antworten zu häufig aufkommenden Fragen und Problemen.

Wie man mit Legacy Code arbeiten kann zeigt Kapitel 9. Grosse Projekte ohne wirkliche Unit Tests benötigen spezifische Vorgehensweise. Auch hier werden Vor- und Nachteile der Ansätze aufgezeigt. Der Einsatz von Tools kann einem auch hier das Leben erleichtern. Depender oder NDepend können Abhängigkeiten anzuzeigen, was als Ausgangslage für Unit Tests dienen kann. Für Java Entwickler werden die Tools JMockit (vergleichbar mit TypeMock) und Vise erwähnt.

Design und Testbarkeit werden noch einmal ausführlich im Anhang A behandelt. Anhang B bietet eine kompakte Auflistung von Tools und Frameworks aus allen Bereichen von Tests.

 
Fazit
Ein sehr gutes Buch zur Kunst des Unit Testings. Auf rund 300 Seiten erfährt man unzählige Möglichkeiten zum sauberen testen. Das Buch richtet sich eher an Leser mit Erfahrungen im Bereich Unit Testing. Für Anfänger mag sich nicht immer erschliessen, worin die Vorteile der jeweiligen Ansätze liegen. Hat man sich aber mit den Problemen selber herumgeschlagen, braucht es nicht mehr viele Worte. Ich fand das Buch eine ideale Ergänzung zu Test Driven.
Der Anhang A hätte ein eigenes, „richtiges“ Kapitel verdient und einige Grafiken hätte man nochmals überarbeiten können. Davon abgesehen ist das Buch sehr gut.

 
Zum Buch
The Art of Unit Testing with Examples in .NET von Roy Osherove, 2009 Manning, ISBN 978-1-933988-27-6, 320 Seiten

Schlagworte: ,

Rückblick auf die Shape’09

3. November 2009 Kommentare aus

Ich war am 27. Oktober an der Shape’09. Die Shape ist die Web-Konferenz von Microsoft, an deren die neusten Technologien von Microsoft für die Webentwicklung vorgestellt werden.

 
Best of Swiss Silverlight
Der Tag begann mit der Verleihung des „Best of Swiss Silverlight“ Awards. Der Gold Award ging an sobees web, das sehr stark an einen Klon von TweetDeck erinnert. Auch bei sobees kann man Twitter und Facebook unter einer Oberfläche nutzen. Der 2. Platz wurde vom B2B-Connector der Schweizerischen Post und dem Medical Cockpit der Solothurner Spitäler AG geteilt. Platz 3 ging an das Interaktives Sales Tool von Siemens Schweiz.

Der Gewinner ist derzeit als Alpha-Version 0.1.8.0 erhältlich. Wenn auch die Applikation besser ist als es diese Version vermuten lässt, so ist es doch schade, das es 2009 keine besseren Silverlight-Anwendungen in der Schweiz gibt.

 
Silverlight
Mit Silverlight will Microsoft die Trennung von Web- und Desktop- Applikationen aufheben. Der grosse Vorteil dabei ist, dass man für Web- wie für Desktop-Applikationen (WPF) die gleichen Controls verwenden kann. Die Applikationen werden via Web verteilt und können sowohl im wie auch ausserhalb des Webbrowsers laufen. Dies macht das Plugin von Silverlight möglich, das als 4MB download für Windows, Mac und Linux erhältlich ist.
An der Shape wurde gezeigt, wie einfach man eine Applikation wie DeepZoom Zermatt mit Visual Studio 2010 und Expression Blend erzeugen kann.

Mich beeindruckte Silverlight sehr. Sich nicht mehr mit Sessions und Postbacks herumschlagen zu müssen würde die Webentwicklung massiv vereinfachen. Zudem hat man alle Vorteile einer Desktop-Applikation und kann die Programme auch so starten. Sollte ich bald mal ein wenig mehr Zeit haben, werde ich mir Silverlight genauer anschauen.

 
ASP.net MVC
ASP.net MVC verfolgt einen ganz anderen Ansatz als Silverlight. Während Silverlight dem Programmierer alles was mit Web zu tun hat wegabstrahiert und im Hintergrund selber macht, ist ASP.net MVC „direkt“ auf der HTTP Verbindung. (Web Forms stehen da etwa in der Mitte zwischen Silverlight und MVC)

ASP.net MVC ist ein Paradigmenwechsel gegenüber Web Forms: es ist stateless, für UnitTesting optimiert und integriert aktuelle Ansätze wie AOP, IOC und DI.

Vorteile:

  • UnitTests sind einfach, dadurch Qualität besser überprüfbar
  • Bessere Wiederverwendbarkeit durch stärkere Kapselung
  • Volle Kontrolle über HTML Output
  • Klarere Strukturierung durch vorgegebenen Projektaufbau

Nachteile:

  • Keine Wiederverwendbarkeit von bestehenden Web Forms Konzepten/Frameworks
  • Entwickler muss wesentlich mehr von Client-side Technologien wie JavaScript und AJAX verstehen.
  • Derzeit fehlt es an GUI-Bibliotheken (Telerik bringt wohl noch in diesem Jahr ein
    entsprechendes Produkt)

 
Azure
Azure ist der Cloud-Computing Dienst von Microsoft. Die „Wolke“ dient als Plattform für den Betrieb von Applikationen und Diensten. Als Vorteile der Cloud werden häufig die Skalierbarkeit und die Ausfallsicherheit genannt. Zudem zahlt man nur für die Leistung, die durch die Applikation auch wirklich verbraucht wird.

Azure bietet die Möglichkeit des „on-premise“ Hosting an. Dabei bleiben die Daten bei einem lokal im Datacenter und nur die Applikation oder die Services laufen in der Wolke. So kann man die Vorteile der Wolke nutzen und heikle Daten dennoch bei sich behalten.
Die Verteilung lokal/cloud lässt sich beliebig kombinieren. Als Beispiel wurde eine Applikation vorgeführt, die auf dem Laptop am Rednerpult lief. Mit einem IPhone konnte über eine URL im Cloud-Dienst auf diese Applikation zugegriffen werden. Die Daten befanden sich in der Cloude und wurden von dort aus aufs IPhone gestreamt.

Die Möglichkeit Cloud-Computing zu nutzen und dennoch sensible Daten bei sich lokal zu haben finde ich eine gute Idee. Dies ermöglicht eine ganz neue Art der Applikationsverteilung. Azure wird an der PDC Mitte November veröffentlicht. Da wird sich dann auch zeigen, was genau alles wirklich einsatzbereit ist.

 
Fazit
Die Shape bietet einem eine einfache Möglichkeit, sich einen Überblick über die aktuellen Technologien von Microsoft für die Webentwicklung zu verschaffen. Mit ein wenig Glück wird nächstes Jahr die Konkurrenz für den Silverlight-Award auch deutlich grösser sein.

 
Folien und Unterlagen
Die Folien und wohl auch Videos sollten bald auf http://www.microsoft.ch/shape abrufbar sein.

Schlagworte: ,
Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.

Schließe dich 278 Followern an