Mittlerweile warte ich seit einem Vierteljahr auf die Freischaltung meiner VDSL-Leitung. Vorgestern habe ich mal wieder bei der Hotline angerufen. Man versprach mir den Rückruf eines Technikers, besagter Rückruf ist jedoch nie erfolgt. Auch im Forum bekommt man momentan keine Antwort. Wie auch immer dieser Fall endet: Nach Ablauf der zwei Jahre sieht mich die [...]
“Unit Tests? Pff, brauch’ ich nicht.” – “Was ist das?” – “Viiiiel zu aufwändig.”
So oder so ähnlich sind die Reaktionen auf die beiden kleinen, unscheinbaren Wörter, die vor allem nach einem klingen: Eine Menge Arbeit.
Dabei sind Unit-Tests eigentlich gar nicht so kompliziert und definitiv nützlich. Ich möchte euch eine kleine Einführung ins Thema geben, und euch ermutigen, ihnen zumindest eine Chance zu geben.
Am Anfang war die Klasse… oder?
Unit Tests (Modultests im Deutschen) sind schon länger ein Begriff, werden aber dennoch immer noch zu selten eingesetzt, auch wenn hier einige Open Source – Projekte eine Vorreiterrolle einnehmen. Grundsätzlich geht es bei Unit Tests darum, die Funktionen einer Klasse zu testen, und zu prüfen, ob die Ausgabe mit den erwarteten Ergebnissen übereinstimmt.
Ein kleines Beispiel:
using System;
public class TestKlasse
{
public int Multipliziere(int a, int b)
{
return a * b;
}
}
Zugegeben, das Beispiel ist trivial. Aber zur Demonstration soll es erstmal genügen. Diese Klasse stellt eine Methode zur Verfügung, mit der ich zwei Werte multiplizieren kann.
Um nun die Ausgaben zu testen, erstelle ich einen Black-Box-Test, d.h., ich vergleiche die Ausgabe der Funktion mit meinen erwarteten Werten. Hierbei hilft mir eine Modultest-Software. Ich habe zwei Möglichkeiten:
- Ich nutze entweder den internen Unit test des Visual Studios, oder…
- …ich verwende NUnit.
Für dieses Beispiel entscheide ich mich für NUnit. Die Verwendung ist eigentlich recht simpel: Zuerst lädt man sich die NUnit-Installationsdatei herunter und installiert NUnit. Anschließend fügt man dem Projekt eine Klassenbibliothek hinzu. Am Besten erstellt man pro Klasse im Programm eine Klasse zum Testen. Hier in diesem Falle also eine Testklasse für unsere – äh – TestKlasse…
using System;
using NUnit.Framework;
[TestFixture]
public class TestKlasseTest
{
[Test]
public void MultipliziereTest()
{
int a = 5;
int b = 6;
TestKlasse TK = new TestKlasse();
//Grob überschlagen: 5 * 6 = 30
Assert.AreEqual(30, TK.Multipliziere(a, b));
}
}
Ok, was ist hier passiert? Nun, zuerst wird dem neuen Projekt die Assembly NUnit.Framework hinzugefügt. Anschließend bekommt die Klasse das Attribut TestFixture, und jede einzelne Testmethode das Attribut Test. Eine Methode im Unit Test hat grundsätzlich den Rückgabewert void und keinen Parameter.
Anschließend wird die Assembly kompilliert. Jetzt kommt wieder NUnit ins Spiel. Bei der Installation wurde eine GUI installiert, über die ihr die Assembly laden könnt. Über “Run” könnt ihr nun den Test ausführen. Ist der Test erfolgreich, solltet ihr nur noch grün sehen…
Sollte doch noch ein Fehler auftreten, so könnt ihr den Fehler im Quellcode korrigieren und anschließend neu kompillieren. Anschließend könnt ihr einfach erneut auf Run klicken.
Warum Unit tests?
“Ok”, mögt ihr jetzt sagen, “ich soll also extra Arbeit investieren, um ein paar Funktionen zu testen. Und wer zahlt mir das?” Berechtigte Frage. Direkt natürlich keiner, indirekt der Kunde. Folgende Überlegung:
Ich schreibe für den Kunden ein Modul, und benutze keine Unit tests. Das Modul weist Fehler auf, ich muss nachbessern. Der Kunde wünscht nach einiger Zeit eine Erweiterung, ich setzte sie um, und es schleicht sich wieder ein Fehler ein. Ich muss wieder nachbessern. Mein Problem: In der Zeit, wo ich Nachbesserungen vornehmen muss, kann ich keine anderen Aufträge bearbeiten. Schlimmer noch: Eventuell handelt es sich um aufwändigere Nachbesserungen und der Kunde erleidet Verdienstausfälle, die er mir womöglich noch in Rechnung stellen kann.
Habe ich stattdessen Unit tests benutzt, kann ich nach dem Ändern (und ggf. Anpassen des Tests) den Test laufen lassen und sehe sofort, wenn sich etwas nicht wie geplant verhält. Ich habe weniger Verdienstausfälle und der Kunde ist glücklich. So amortisiert sich die zusätzliche Zeit, die man für die Tests investieren muss, recht bald.
Weitere Hinweise…
An dieser Stelle sei auf die offizielle NUnit – Dokumentation verwiesen. Natürlich gibt es an dieser Stelle noch mehr Möglichkeiten: Exceptions, komplexere Klassen, Test-Suiten etc…
Auch sollte man sich einmal mit Testgetriebener Entwicklung beschäftigen, ein sehr interessantes Thema.
Zwei oder mehrere Dictionaries zusammenfügenSo kann man recht einfach 2 oder mehrere Dictionaries zusammenfügen. Behandelt allerdings keine Kollisionen! public static class DictionaryExtensions { // Works in C#3/VS2080: // Returns a new dictionary of this … others merged leftward. // Keeps the type of ‘this’, which must be default-instantiable. // Example: // result = map.MergeLeft(other1, other2, …) public static T [...] |
[Telekom] Irgendwie habe ich es doch geahnt…Tja, wie es scheint, habe ich wieder Recht gehabt. Telekom… Mittlerweile sind fast 4 Wochen vergangen, ich habe immernoch keinen VDSL-Anschluss. Also heute mal die Hotline bemüht. Nach 15 Minuten Warteschleife bekam ich dann eine Mitarbeiterin an den Hörer. Ihre Antwort, auf meine Frage, wie der Status meiner Call & Surf Comfort VDSL 25 – [...] |
|
Danke Facebook!Wtf? “Schick ihr eine Nachricht”?! Hallo Schatz, ich schicke dir dieses Jahr lieber eine Nachricht über Facebook. Alles Gute zu unserem Jahrestag. Machst du nachher Essen und bringst noch Tomaten mit? Waaaaaaaaaaaaaaaaaah……… |
Autsch – gulli.com macht Werbung für christliche FundamentalistenJaja, das böse Google AdWords… Heute ist es gulli.com zum Verhängnis geworden. Unten rechts wird doch recht prominent ein Werbeverweis auf ein christliches Aktionsbündnis gegeben: Ich möchte das Bündnis nicht verlinken, zitiere aber an dieser Stelle gerne mal die Eckpunkte: Konkret sollte die Union folgende politische Projekte beschließen: Deutschland braucht einen Aktionsplan für den Jugendmedienschutz, [...] |
SmallTune – es hat doch mal geklappt…Ich muss gestehen, ich bin gerade ein bisschen baff. Ich hatte vor einiger Zeit mal einen Audioplayer geschrieben, SmallTune. Die Entwicklung habe ich irgendwann Ende 2010 zu Gunsten eines anderen Projektes eingestellt. Heute habe ich mir dann mal die Statistiken meiner Webseite angesehen, und dabei sind mir die Links vom com! – Magazin aufgefallen. Nach [...] |
Normalisieren schadet nicht…Es ist mal wieder einer Hackergruppe gelungen, den Shop von K&M Elektronik zu hacken. In dem Thread finden sich auch drei Mirror mit den Datenbankschemata. Eine Tabelle ist mir dabei besonders ins Auge gefallen: +++++Table: Artikel +++Columns: ArtNr Gruppe Untergruppe Name Hersteller HerstArtNr Beschreibung Infos Zubehoer winner Preis PreisF HPreis HPreisF KPreis GPreis KoPreis PromoPreis [...] |
[Wallpaper] Spiegelung Brandenburger TorIch habe mal wieder etwas mit Blender gearbeitet. Herausgekommen ist dabei, basierend auf einem Tutorial des Blender-Gurus ein Spiegelbild, wie ich sie auch gerne fotografiere. Die Spiegelung ist ein Foto, welches ich geschossen habe, bei dem Pflaster handelt es sich um eine Textur, zusammen mit einigen Effekten. Es erinnert mich auf jeden Fall an unseren [...] |
[Telekom] Noch kein VDSL…Es ist nun zwei Wochen her, das die Telekom meinen neuen Anschluss geschaltet hat. Allerdings ist noch immer keine Spur von VDSL vorhanden. Ich denke, es ist langsam an der Zeit, dem Kundencenter etwas auf die Füße zu treten. |




![[Wallpaper] Spiegelung Brandenburger Tor](http://blog.danielgilbert.de/wp-content/uploads/2011/08/berlin_puddle_1280x800-150x150.png)