Testen mit NUnit

Testbasierte Entwicklung ist schon eine schöne Sache, vor allem bei größeren Projekten. Mit Hilfe sogenannter Unit-Tests kann man dabei automatisiert überprüfen ob der zu testende Softwareteil noch immer die Ergebnisse liefert, die erwartet werden. Meist ist es so, dass man in größeren Softwareprojekten etwas ändert und damit implizit an anderen Stellen Fehler einbaut, welche ohne Unit-Tests gar nicht bzw. erst später auffallen.

Für die Entwicklung unter .NET/Mono mit Hilfe des Visual Studios habe ich mich dabei für NUnit entschieden, da man dieses im Gegensatz zu MsTest auch unter Linux und Mac OS X nutzen kann. Damit sich das ganze bequem in das Visual Studio integriert nutze ich TestDriven.NET welches unter http://www.testdriven.net/ bezogen werden kann. Der persönliche Gebrauch ist dabei kostenlos.

Nach der Installation von TestDriven.NET kann man sein Visual Studio starten und mit der testbasierten Entwicklung beginnen. Dabei hat man zwei Möglichkeiten dies zu lösen. Die erste Möglichkeit ist es die Tests in ein extra Projekt zu verlagern so das diese nicht in der zu testenden Software vorkommen. Bei der zweiten Möglichkeit werden die Tests direkt im zu testenden Projekt geschrieben (z.B. in einen Namespace „Tests“).

Als Beispiel sei folgende Klasse gegeben:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Project
{
	public class FooBar
	{
		public int A { get; private set; }
		public int B { get; private set; }
		public int C { get; private set; }

		public FooBar(int a, int b, int c)
		{
			A=a;
			B=b;
			C=c;
		}
	}
}

Die Klasse „FooBar“ nimmt dabei im Konstruktor die drei Variablen a, b und c entgegen und weist sie den jeweiligen Eigenschaften der Klasse zu. Um nun zu testen ob diese Zuweisung funktioniert schreiben wir eine entsprechende Test-Unit. Dazu erstellen wir eine Klasse namens: „FooBarTest.cs“:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;

namespace Project
{
	[TestFixture]
	public class FooBarTests
	{
		[Test]
		public void TestNewFooBar()
		{
			FooBar fooBar=new FooBar(13, 24, 47);

			Assert.AreEqual(13, fooBar.A);
			Assert.AreEqual(24, fooBar.B);
			Assert.AreEqual(47, fooBar.C);
		}
	}
}

Diese Testklasse testet nun ob die Werte die im Konstruktor angegeben werden auch wirklich in den entsprechenden Eigenschaften landen. Dazu wird zuerst das NUnit Framework mittels:

using NUnit.Framework;

eingebunden. Mittels des Attributes „[TestFixture]“ sagen wir dem NUnit Framework das sich in dieser Klasse Unit-Tests befinden. Bei diesem Attribut gibt es einige Einschränkungen, so darf die Klasse z.B. nicht abstrakt sein, näheres dazu erfährt man auch in der Dokumentation.

Das Attribut „[Test]“ über der Funktion „TestNewFooBar“ teilt dem Framework mit das es sich bei dieser Funktion um einen Unit-Test handelt, welcher überprüft werden soll. Dazu legen wir in der Funktion eine Instanz von „FooBar“ an und übergeben die entsprechenden Werte an den Konstruktor.

Mittels der „Assert.AreEqual“ Funktion (weitere „Assert“ Funktionen findet man in der Dokumentation) überprüfen wir ob die Werte auch bei den Eigenschaften A, B und C angekommen sind. Wäre dies nicht der Fall so würde der Tests fehlschlagen.

Nachdem ein Test für die entsprechende Klasse geschrieben wurde, klickt man im Visual Studio mit der rechten Maustaste auf die Testklasse und wählt dort „Run Test(s)“ aus. Möchte man mehrere Tests laufen lassen so muss einen übergeordneten Ordner auswählen. Wenn alles richtig gemacht wurde, sollte man folgende Ausgabe sehen:

------ Test started: Assembly: Project.exe ------

1 passed, 0 failed, 0 skipped, took 3,07 seconds (NUnit 2.6.0).

Falls ein Fehler aufgetreten ist so sieht das ganze so aus:

------ Test started: Assembly: Project.exe ------

Test 'Project.FooBarTests.TestNewFooBar' failed: 
  Expected: 47
  But was:  0
	FooBarTests.cs(19,0): bei Project.FooBarTests.TestNewFooBar()

0 passed, 1 failed, 0 skipped, took 1,66 seconds (NUnit 2.6.0).

Findet man einen Fehler bei einem Test sollte man schauen wodurch dieser verursacht wird und ihn beheben. Wenn man nun bei der späteren Entwicklung Fehler findet (und beseitigt), welche durch keinen Tests abgedeckt sind, so sollte man gleich einen entsprechenden Test dafür schreiben, damit dieser Fehler nicht ein weiteres Mal auftreten kann.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/NUnit
http://de.wikipedia.org/wiki/XUnit

Das Invertika Update im Juli

Wieder ist ein Monat vergangen und wie jeden letzten Sonntag im Monats wird es somit wieder Zeit für das Invertika Update. Bei Invertika handelt es sich um ein freies 2D-MMORPG für Linux und Windows.

So gab es bei den Tilesets einige Verbesserungen an der Windmühle und einem der „Indoor“-Tilesets. In Nelaro wurde die Hotelhöhle um einige Zimmer erweitert. Auch andere Häuser in Nelaro besitzen nun Innenräume. Einige Stellen der Wüste wurden begrünt so das diese nun etwas lebhafter aussehen sollten. Der Friedhof in Burg Cedric wurde verschönert, genau wie das Lagerhaus in der Burg. Auch wurden wieder einige Fehler bei den Kollisionen gefunden, welche natürlich behoben wurden.

Auf der Skriptseite gibt es nun einige NPCs welche gesprächiger sind und auch hier wurden viele kleinere Fehler beseitigt. Beim neuen Client wurde damit begonnen die Loginsequnz in Javascript nachzubauen und das ganze gegen den neuen Server getestet.

Im Wiki wurden viele Ungereimten korrigiert und einiges aufgeräumt. Das „ivktool“ wurde um einige Fehler erleichtert, so das dieses nun stabiler laufen sollte. Wer neugierig geworden ist, der kann das Invertika Projekt unter http://invertika.org besuchen und sich selbst ein Bild vom Spiel machen.

UFO:AI

In den letzten Tagen kam ich endlich mal wieder dazu UFO:AI nach langer Abstinenz auszuprobieren. Die früheren Versionen gefielen mir nicht wirklich, da sie keine Kampagne boten, sondern nur den Bodeneinsatz. Bei UFO:AI handelt es sich um ein Remake der X-Com Reihe, in welcher es darum geht, die Erde vor einer außerirdischen Bedrohung zu retten.

Im Gegensatz zum ebenfalls freien X-Force: Fight For Destiny läuft UFO:AI dabei nicht nur unter Windows, sondern unterstützt auch Linux und Mac OS X. Die aktuelle Version bietet dabei eine fast vollständige (und sinnvoll übersetzte) deutsche Lokalisation.

Im Gegensatz zu anderen X-Com Spielen bzw. deren Remakes fühlt sich UFO:AI ungleich schwerer an, was darin mündete das die Kampange bei mir immer vorschnell zu Ende ging.

Wer bei solchen Problemen Abhilfe schaffen möchte, der kann im Spiel die Konsole aufmachen (mittels ^) und dort:

save_compressed 0

eingeben. Damit werden die Spielstände unkomprimiert gespeichert, so das man die Savegames welche als XML Datei vorliegen, problemlos bearbeiten kann. Die offizielle Seite des Spieles ist unter http://ufoai.org/ zu finden. Das Spiel und seine Inhalte stehen dabei unter der GPL.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/X-Com
http://de.wikipedia.org/wiki/UFO:_Alien_Invasion

Ubuntu 12.04 + Time Machine

Die Funktion „Time Machine“ welche unter Mac OS X zu finden ist funktioniert mittels einer USB Festplatte oder einer Time Capsule. Wer aber nun schon einen Linux Server (in diesem Fall ein Ubuntu 12.04) rumzustehen hat, der möchte diesen eventuell für die Sicherung mittels Time Machine benutzen. Dazu gibt man im der Konsole folgendes ein:

sudo apt-get install netatalk avahi-daemon libnss-mdns

Nachdem die entsprechenden Pakete installiert worden sind, konfigurieren wir den Avahi Service mittels „sudo nano /etc/avahi/services/afpd.services“. In die sich öffnende Datei tragen wir folgendes ein:

<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h</name>
<service>
<type>_afpovertcp._tcp</type>
<port>548</port>
</service>
<service>
<type>_device-info._tcp</type>
<port>0</port>
<txt-record>model=TimeCapsule</txt-record>
</service>
</service-group>

Danach legen wir die entsprechende Freigabe an, in dem wir die Datei „/etc/netatalk/AppleVolumes.default“ mittels:

sudo nano /etc/netatalk/AppleVolumes.default

bearbeiten. Der Inhalt dieser Datei sieht dabei so aus:

/home/seeseekey/Backup TimeMachine allow:seeseekey cnidscheme:dbd options:usedots,upriv,tm

Nun muss noch einmal der Server neugestartet werden und schon kann die Freigabe mittels Time Machine benutzt werden. Sollte beim Start des ersten Backups folgende Fehlermeldung:

Fehler 30 beim ersten Backup mittels Time Machine

erhalten so muss man das Terminal öffnen und dort folgendes eingeben:

hdiutil create -size $500g -fs HFS+J -type SPARSEBUNDLE -volname “BACKUP” Amy_133713371337.sparsebundle

Damit erzeugen wir eine Sparsebundle-Datei. Der Parameter Size gibt dabei die maximale Größe an. Der Dateiname entspricht dem Schema „COMPUTERNAME_MACADRESSE.sparsebundle“. Die erzeugte Datei kopieren wir nun in das Wurzelverzeichnis der entsprechenden Freigabe. Danach sollte das Backup dann ohne Probleme funktionieren.

Weitere Informationen gibt es unter:
http://meetinx.de/tutorial-time-machine-auf-nas-netzwerk-laufwerk/
http://www.kvibes.net/2011/08/mac-os-x-lion-timemachine-und-linux/
http://meetinx.de/tutorial-time-machine-backup-sparsebundle-in-groesse-begrenzen/
http://blog.rotzoll.net/2010/07/linux-als-apple-afp-share-mit-timemachine-support-backups-uber-das-netzwerk/

Wasteland 2

Gestern versuchte ich Fallout 3 auf einem Mac OS X und anschließend auf einem Linux System zu installieren. Das ganze sollte mittels Wine zum laufen gebracht werden, was grundsätzlich kein Problem darstellen sollte. Allerdings stellte sich das dank DRM aller SecuROM und DVD Überprüfung als ein Ding der Unmöglichkeit heraus, vor allem dann wenn man kein CD/DVD-ROM Laufwerk im entsprechenden Rechner hat. Nun gut wer nicht will, der hat schon.

Der Übertäter in Form von Fallout 3

Wenn Fallout schon nicht funktioniert, so kann man sich ja immerhin noch am geistigen Vater des Spieles bedienen: Wasteland. Allerdings muss man sich nicht mit dem Original von 1987 begnügen sondern kann ab Oktober 2013 mit deren Nachfolger Wasteland 2 vorlieb nehmen. Das ganze würde über Kickstarter mit einer Summe von $ 2.933.252 finanziert.

Das Spiel wird es in einer Linux, Windows und Mac OS X Version geben und auch als DRM freie Version angeboten. Neben der englischen Originalsprache soll das Spiel mindestens in die Sprachen Französisch, Italienisch, Deutsch und Spanisch übersetzt werden.

Technisch wird das ganze auf der Unity Engine aufsetzen, welche dafür um eine Linux Unterstützung erweitert wird. Den entsprechenden Entwicklerblog findet man unter http://wasteland.inxile-entertainment.com/blog/.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Wasteland