Sunday, November 23, 2014

Unit Test mit Xamarin.Android

Mit Xamarin werden auch 2 Unit-Test-Projekt-Templates mit installiert.

Und zwar jeweils eines für iOS und eines für Android.

clip_image002clip_image004

Verwendet wird dabei eine leicht abgewandeltes NUnitLite.

Wird ein neues Unit Test App Projekt (Android) angelegt, wird die Referenz zu Xamarin.Android.NUnitLite in diesem Test-Projekt hinzugefügt. Im nächsten Schritt muss euer Projekt als Referenz zu eben diesem Testprojekt hinzugefügt werden – in meinem Beispiel die XamarinFormsSample.PCL, dann kann es schon losgehen mit dem Test.

clip_image005

Es wird ebenfalls eine Beispieldatei angelegt, die TestSample.cs. Wenn man sich diese näher ansieht, dann erkennt man, dass diese bereits eine sehr gute Ausgangsbasis für die eigenen Tests ist.

Die Datei beginnt mit den folgenden Attributen:

· TestFixture - Dieses Attribut markiert die Klasse als “Testklasse”, d. h. diese beinhaltet Unit-Tests, eine optionale Setup Methode und eine optionale Teardown Mothode.

Das Attribut alleine reicht noch nicht, diese so markierte Klasse muss einen Default-Konstruktor

· SetUp - Dieses Attribut wird innerhalb einer Klasse mit dem Attribut TestFixture dazu verwendet, um Funktionalität auszuführen, die VOR jeder Testmethode aufgerufen werden muss, also der ideale Platz um den Testfall zu initialisieren.

· TearDown – Dieses Attribut markiert eine Methode, die NACH jeder Testmethode aufgerufen wird, also ideal zum “Aufräumen”.

Eine Klasse, die mit dem Attribut TestFixture markiert wurde kann nur eine SetUp und eineTearDown Methode beinhalten. Wenn es mehrere davon gibt, wird das Projekt zwar erfolgreich kompiliert, aber die Methoden werden während der Laufzeit nicht ausgeführt.

clip_image006

Soweit zum generellen Aufsetzen der Unit-Test-Klasse. Jetzt fehlen noch die Testmethoden, das sind Methoden die mit folgendem Attribut markiert werden:

· Test - Das Test Attribut markiert eine Methode, die sich innerhalb einer Klasse befindet, die als TestFixture markiert wurde als Test-Methode. Diese darf KEINE Parameter aufweisen. Werden Parameter definiert, dann kann zwar kompiliert werden, der Test wird allerdings nicht ausgeführt werden und scheint später in dem “Test Not Run“-Bereich auf.

Das Ergebnis der Test-Methode wird mit der Assert Klasse und deren Methoden festgelegt. Es gibt insgesamt 18 davon, ich möchte nur die aus der Beispiel-Datei herausgreifen:

· Asstert.True(<condition>) - Die <condition> muss true ergeben, dann ist der Testfall in Ordnung.

· Asstert.False(<condition>) - Die <condition> muss false ergeben, dann ist der Testfall in Ordnung.

· Asstert.Inconclusive – das Ergebnis sollte manuell überprüft werden.

clip_image007 clip_image009

Lässt man das Testprojekt ablaufen, sieht das im Microsoft Android Emulator so aus:

clip_image011 clip_image013 clip_image015

Die Dokumentation zu NUnit, bzw. NUnitLite findet ihr hier.

Friday, November 21, 2014

Visual Studio 2015 und Android Emulator mit Xamarin startet nicht?

Falls Ihr eine Xamarin.Android Applikation aus Visual Studio 2015 zum Microsoft Android Emulator deployen wollt und ihr bekommt folgende Meldung im Output

In mgmain JNI_OnLoad
Couldn't connect to logcat, GetProcessId returned: 0

dann vergesst nicht das Häkchen in den Android Projekteinstellungen für

Use Fast Deployment (debug mode only)

zu entfernen.


Thursday, November 20, 2014

Codefest.at: Xamarin.Forms, oder: Knapp 100% Code-Reuse auf mobilen Plattformen

Xamarin.Forms, einfach genial. Vielen lieben Dank an das CodeFest.atTeam für die Veröffentlichung!
us gegebenem Anlass möchte ich euch gerne den Einstieg in die mobile Entwicklung mit Xamarin und speziell Xamarin.Forms näherbringen. Ihr fragt euch möglicherweise, was denn dieser „Anlass“ sein könnte?
clip_image002
Nun, zum Ersten ist es so, dass die Visual Studio 2015 Preview den Android Emulator mitliefert, was die Entwicklung vereinfacht und die Developer-Experience merklich erhöht, mehr dazu findet ihr hier.
Zum Zweiten ist es so, dass ich nächste Woche wieder einen Xamarin Kurs abhalte und ich gerade wieder einmal meine Unterlagen überarbeite und ich dabei meine treuen Blog-Leser auch teilhaben lassen möchte.

Drittens, und das ist für euch bestimmt noch interessanter, ist die Draft-Version des Xamarin.Forms Buches von Charles Petzold in der Microsoft Virtual Academy als Gratis-Download verfügbar. Und zwar genau hier.clip_image003
Alles gute Gründe, sich Xamarin und Xamarin.Forms genauer anzusehen, aber zuvor sollten wir die Frage klären:

 

Was ist Xamarin und was kann es für mich tun?

Nun, jeder Entwickler, der mobile Applikationen mit
· C# und
· nativer Performance und
· nativem Look & Feel
für Windows Phone UND iOS UND Android erstellen möchte, sollte sich Xamarin genauer ansehen. Xamarin stellt 100% der nativen APIs für iOS, Android und Windows zur Verfügung.
Als Entwicklungsumgebung liefert Xamarin zwar auch das Xamarin Studio zur Entwicklung mit, aber es ist auch möglich, den gesamten Code in Visual Studio zu erstellen, allerdings benötigt ihr dann auch zumindest die Business-Lizenz. Der Vorteil ist, dass eure gewohnten Tools, wie z. B. Resharper, weiterhin verwendet werden können, ihr aber eben mit dem Xamarin SDK die mobile Plattform eurer Wahl anprogrammiert.
Es werden immer native und keine interpretierten Applikationen für die gewählte Zielplattform erstellt.
clip_image005
Dies wurde dadurch ermöglicht, dass 100% des Android SDKs und 100% des iOS SDKs auf C# gemappt wurden. Kurz gesagt: wenn man es in Java für Android programmieren kann, klappt das auch mit Visual Studio, C# und Xamarin.Android. Das Gleiche gilt eben genauso für XCode mit Objective-C und Visual Studio, C# und Xamarin.iOS.

 

Was benötige ich, um mit Xamarin zu entwickeln?

Das kommt jetzt ein klein wenig darauf an, auf welche mobile Plattform ihr mit eurer Entwicklung abzielt:
· Android: das Android SDK, optional eine Google Developer Subscription (einmalig $25), mehr dazu findet ihr hier – falls ihr die App veröffentlichen wollt, dann ist diese natürlich zwingend notwendig.
· iOS: einen MAC, der als sogenannter Build-Host dient, auf diesem muss XCode installiert sein und ihr benötigt ZWINGEND eine Apple Developer Subscription (jährlich €83), mehr dazu hier. Der Grund ist, dass die Erstellung nativer iOS Applikationen zwingend auf dem MAC mit den Tools von Apple erfolgen muss.
Dann natürlich noch Xamarin selbst, eine der 4 Editionen, oder die Trial Lizenz - diese ist 30 Tage ohne Einschränkungen lauffähig und findet ihr hier zum Download.

 

Was kostet Xamarin?

Es gibt 4 verschiedene Lizenzen:
· Starter (kostenlos, aber bez. Funktionen in sehr eingeschränkter Form)
· Indie ($25/Monat)
· Business ($83/Monat)
· Enterprise ($158/Monat)
Für Studenten gibt es die Indie-Version gratis, mehr dazu findet ihr hier. Für MSDN-Abonnenten gibt es ebenfallsspezielle Rabatte, momentan kostet die Business Edition $799/Jahr und pro Plattform.
Den genauen Unterschied in den Funktionen könnt ihr hier nachlesen, ich empfehle euch zumindest die Indie-Version zu verwenden, ich persönlich habe die Xamarin Business Edition für iOS und Android.

 

Wie funktioniert die Entwicklung mit Xamarin?

Es gibt zwei Möglichkeiten, um mit Xamarin eine native, mobile Applikation zu erstellen:
1. Die GUI wird für die jeweilige Plattform extra erstellt, die Applikations-Logik kann wiederverwendet werden
2. Die GUI wird mit Xamarin.Forms erstellt, damit kann im Idealfall auch die GUI nahezu zu 100% auf jeder der mobilen Plattformen wiederverwendet werden.
clip_image007
Ersteres wird auch der sogenannte Silo-Approach genannt: Drei Säulen – für jede Plattform eine unterschiedliche Implementierung der grafischen Oberfläche.

 

Was ist Xamarin.Forms?

Mit Xamarin.Forms ist es – im Gegensatz zum Silo-Approach – möglich, eine Applikation 1x zu entwickeln, auch die GUI, und zwar mit nahezu 100% gleichem Code. Das heißt, kaum extra Code-Zeilen für eine der drei führenden mobilen Plattformen (Android, iOS und Windows Phone). Möglich wird das, indem Xamarin.Forms die nativen Controls durch eine Zwischenschicht abstrahiert. So gibt es z. B. einen Xamarin.Forms.Button, dieser wird letztendlich ein UIButton, wenn es sich um eine iOS App handelt, zu einem Android Button bei einer Android App und zu einem Windows Phone Button bei einer Windows Phone App (aber dazu später noch genaueres).
clip_image009
Zusätzlich werden von Xamarin.Forms gewisse Unterschiede der mobilen Plattformen per Default eingebaut. So ist eine iOS-Applikation per Default weiß, eine Android App aber eher in schwarz gehalten. Das bedeutet, dass es eben z. B. per Default ein anderes Farbschema für Schriften und Texte verwendet werden muss. Das kann man zu Beginn getrost links liegen lassen, Xamarin.Forms kümmert sich darum.
Um Xamarin.Forms auch für Windows Phone einsetzen zu können, benötigt ihr zumindest eine Xamarin Lizenz für eine der beiden anderen Plattformen.

 

Wie wird eine Xamarin.Forms App erstellt?

Xamarin liefert in der Business-Edition Visual Studio Templates mit, wenn ein neues Projekt angelegt wird. Da eine Xamarin.Forms Applikation erstellt werden soll, sind 3 Templates von Interesse:
· Eine „Blank App (Xamarin.Forms.Portable)“,
· eine „Blank App (Xamarin.Forms.Shared)”,
· eine „Class Library (Xamarin.Forms.Shared)”
clip_image011
Also prinzipiell entscheidet man sich, ob man das Projekt als „Shared Project“, oder als „Portable Class Library“ aufsetzen möchte.
Eine Shared Application kompiliert die Klassen in jede einzelne App. Sollten Unterscheidungen für eine spezielle Plattform notwendig sein, wird häufig eine Kompiler-Direktive verwendet. Der Vorteil ist hier, dass nur eine einzige Quelldatei für alle drei Plattformen existiert.
clip_image013Quelle: Xamarin docs
Die Portable-Class Library vereint den kleinsten gemeinsamen Nenner aller verwendeten Plattformen, es ist also im Prinzip keine Unterscheidung für eine der drei mobilen Plattformen von Nöten, da diese PCL für alle drei Apps die Gleiche ist.
clip_image015Quelle: Xamarin docs
Aber warum eine Entscheidung treffen? Ich erstelle üblicherweise eine „Blank App (Xamarin.Forms.Shared)“ und füge danach eine „Class Library (Xamarin.Forms.Portable)“ hinzu. Damit kann ich alle Vorteile aus beiden Lösungen verwenden. Das sieht dann im Endeffekt so aus:
clip_image016
Es ist das Shared Project zu finden, die Android, sowie die iOS App, danach die PCL und am Ende die Windows Phone App. Die PCL wurde als Referenz zu den drei App-Projekten hinzugefügt.
Es lohnt sich, nach dem Anlegen der finalen Projektstruktur das Xamarin.Forms-Package auf die aktuelle Version zu aktualisieren.
clip_image018

 

XAML-Layout und Datenbindung?

Unter iOS und Android gibt es an und für sich keine MVVM-Unterstützung, wie sie in WPF existiert, aber Xamarin.Forms macht das nun für eben diese beiden Plattformen möglich. Inklusive XAML.
Um das in der Praxis zu testen, habe ich mir eine bestehendes MVVM Beispiel geholt, nämlich die „Simple MVVM and Windows Phone 7“-Applikation von hier und diese mit Xamarin.Forms umgesetzt.
Dieses ursprüngliche Beispiel zeigt die Verwendung von MVVM anhand einer Länderliste. Wenn ein einzelnes Land angewählt wird, so gelangt man zu den Details, bzw. erhält weitere Informationen über dieses Land. Da es sich um ein MVVM-Einführungsbeispiel handelt, verwendet es natürlich Models, ViewModels und Views und verwendet die zugehörige Datenbindung. Außerdem beinhaltet die Applikationen ein Verzeichnis mit Bilder, wo die zu jedem Land zugehörige Flagge enthalten ist.
Das Endresultat der Konvrtierung der Windows Phone 7 App mittels Xamarin.Forms sieht auf den drei Plattformen (Android, iOS; Windows Phone 8) so aus:
clip_image020clip_image022clip_image024
Das ist jetzt noch ganz ohne „Tweaks“ für eine bestimmte Plattform, d. h. eine Code-Basis für alle 3 mobilen Clients. Das gilt sowohl für die Business Logik, ALSO AUCH für das Frontend.
Ich möchte hier nur einige der Anpassungen aufgreifen, die gegenüber der originalen Windows Phone 7 App durchzuführen waren:
Generell gilt: WPF, bzw. Silverlight XAML != Xamarin XAML, das ist am deutlichsten an den Controls zu erkennen. Nachfolgend ein Beispiel:
Windows Phone 7 XAML:
image
Xamarin.Forms XAML
image
Auffallend, dass wir statt dem StackPanel ein StackLayout sehen, statt dem TextBlock ein Label und ich die Styles einfach entfernt habe. Erstens gibt es diese nicht mehr und zweitens haben wir hier es nicht nur mit einer Plattform zu tun, sondern mit drei verschiedenen – und da ist es erst einmal schwierig mit einem bestimmten Style „ins Rennen zu gehen“. Xamarin.Forms nimmt uns per Default schon einiges ab, wie es in den Screenshots zu sehen ist, konkret spiele ich auf die Hintergrundfarbe und die Vordergrundfarbe der Controls an.
Generell würde ich empfehlen, wenn es sich um eine Applikation, die mit Xamarin-für mehrere mobilen Plattformen entwickelt wird, eine Plattform als „führende“ zu definieren. Sobald diese einen Stand hat, der für den Test frei gegeben werden kann, kann man die zweite und danach die dritte Plattform anpassen, bzw. feintunen. Damit ist sichergestellt, dass zumindest eine Plattform quasi fertig ist und funktioniert. Die anderen beiden folgen in sehr kurzem Abstand. In dem oberen – zugegeben relativ einfachem - Beispiel wurde wie erwähnt absolut NICHTS angepasst.
Grund für diese eigenen Controls ist die Funktionsweise von Xamarin.Forms. Durch die Plattform-abhängigen Bibliotheken verwandeln sich die Xamarin.Forms-Controls in die jeweils passenden der jeweiligen Zielplattform, wie das nachfolgende Bild anschaulich zeigt.
clip_image026
So wird also aus einem Xamarin.Forms.Button ein UIButton, bzw. ein Android.Widget.Button unter Android und ein System.Windows.Controls Button unter Windows Phone.
Die Datenanbindung wurde von Xamarin gleich umgesetzt, wie wir das schon von WPF, oder der Windows Phone Entwicklung gewohnt sind. Das ViewModel und das Model habe ich nahezu ohne Änderungen übernommen, ich habe nur mit dem Bild getrickst und ein weiteres Property, um den Applikations-Titel nur unter Windows Phone darzustellen eingefügt.
Als Beispiel hier die Liste der Flaggen in der Windows Phone 7 App (der Trigger aus dem Originalcode wurde hier entfernt, da Trigger in Xamarin.Forms noch nicht offiziell unterstützt sind):
image

Und hier die Xamarin.Forms App:
image
Wichtig zu erwähnen ist noch, dass XAML mit Xamarin.Forms nur in einer Portable Class Library funktioniert und nicht in einem Shared Asset Project. Des Weiteren gibt es noch keinen XAML Designer, das könnte euch das Einarbeiten in Xamarin.Forms etwas erschweren, wenn ihr bisher eure XAML-GUI mit Blend, oder in Visual Studio mit dem Designer gebaut habt.

 

Zusammenfassung

Generell kann man sagen, dass Xamarin mit den Xamarin.Forms ein großer Wurf gelungen ist. Es ist zwar erst die erste Version, es lassen sich aber bereits hervorragend Business-Applikationen damit entwickeln. Wir dürfen gespannt sein, was das Xamarin-Team in den nächsten Monaten noch für Überraschungen für uns bereithält.

Friday, November 14, 2014

Codefest.at: Visual Studio 2015. Xamarin und der neue Android Emulator

Die Neuigkeiten der Microsoft Connect sind für Xamarin-Entwickler durchwegs positive Nachrichten gewesen. Aber es waren ja nicht nur „Nachrichten“, nein, es steht ja auch gleich einiges zum Ausprobieren zur Verfügung. Z. B. Visual Studio 2015, inklusive verfügbaren Xamarin Projekt-Templates UND einem integrierten Android Emulator.
Letzteres ist besonders großartig, da es bisher einer gewissen Leidensfähigkeit bedurfte, um mit den Android-Emulatoren aus dem SDK zu arbeiten (Stichworte: langsam, verlorene Verbindungen, usw.).
Also war ich gespannt wie ein Regenschirm und wollte mir das gleich einmal ansehen. Was dabei herausgekommen ist, möchte ich euch gerne nachfolgend beschreiben.

Die Installation von Visual Studio 2015

Dazu erst einmal der übliche Download des Installers, diesen findet ihr hier:
clip_image001
Ich habe nur „die notwendigsten“ Features ausgewählt, da auf meiner Maschine z. B. bereits die Windows Phone 8.1 Emulatoren installiert sind, es bleibt euch aber überlassen, gleich einmal alles auf die Festplatte „zu schmeißen“.
clip_image002
Wichtig ist nur, dass ihr nach dem üblichen Setup auch das zweite Setup durchlaufen lässt, um den Android Emulator zu installieren. Solltet ihr etwas zu vorschnell gewesen sein und den Installer bereits geschlossen haben, so könnt ihr das über „Programs and Features“ beheben, indem der „Secondary Installer“ noch einmal mittels „Change“ aufgerufen wird.
clip_image003
Nachfolgend wiederum meine Auswahl, ich habe aber auf der Maschine schon das Android SDK - ihr wollt möglicherweise wieder alles installieren:
clip_image004
Wichtig ist in jedem Fall der Microsoft Visual Studio “Emulator for Android”.

Neues Android Projekt – Versuch 1

Nachdem auch diese Installation durchgelaufen war, dachte ich mir, ich rufe gleich einmal Visual Studio 2015 auf und lege sofort mit einem Beispielprojekt los.
clip_image005
Gesagt, getan – und dann sogleich ein neues Projekt anlegen – soweit der Plan. WOW, es gibt unter Visual C# ein Android Projekt, nun, mir nichts, dir nichts, unverzüglich dieses anwählen und noch einen passenden Namen verpassen.
clip_image007
Soweit so gut, nur…..schade, das war es noch nicht. Ein netter Dialog weist mich darauf hin, dass ich Xamarin installieren sollte.
clip_image009

Xamarin Installation

Gut, auf Download Xamarin geklickt - dafür scheint der Button ja da zu sein - diese Aktion bringt mich zu diesem Link:
Ah, ja. Als Xamarin-Entwickler kennt man diese Webseite bereits, hier kann man sich, falls noch kein Xamarin-Login vorhanden ist, die Xamarin-Trial herunterladen – unter Angabe einiger weniger Informationen.
clip_image011
Gut, ich habe bereits meine Lizenz, aber trotzdem habe ich noch einmal alles eingegeben und den „Download Xamarin for Windows”-Button gedrückt. Das ist wohl eine weise Entscheidung, da die Datei “XamarinInstaller-VS2015.exe” heruntergeladen wird und es somit gut aussieht mit der VS 2015 Integration. Gleich mal „das Ding“ starten und der tollen Dinge harren, die da noch kommen mögen…
clip_image013
Nach der bekannten Installation (Android SDK, IOS-Integration,…) – welche ein klein wenig laaaaaange dauert, wenn man bisher noch kein Java und kein Android SDK installiert hatte, ist alles erledigt und der große Moment ist gekommen.
Nun, das dachte ich zumindest, der Xamarin-Installer verrichtet seine Arbeit sehr brav, allerdings sind in VS 2015 weit und breit keine Templates zu sehen – das dürfte allerdings nur auf Maschinen passieren, wo Xamarin bereits installiert ist.

VS 2015 Xamarin AddIn aktivieren

Um das zu beheben, erst einmal VS 2015 schließen und dann wiederum in „Programs and Features“ und „Xamarin“ anpassen.
clip_image014
Es wurde nämlich nicht automatisch die Integration für VS 2015 installiert, schade, aber das sind ja nur ein paar Mausklicks.
clip_image016 clip_image018

Neues Android Projekt – Versuch 2

So, jetzt aber, gleich wieder VS 2015 gestartet und die (erwarteten Templates tauchen wieder auf.
clip_image019
Sehr gut, dann kann es ja gleich losgehen mit einem neuen Xamarin.Forms Projekt.
clip_image021
Das sieht jetzt aber wirklich alles sehr gut aus, aber wiederum VORSICHT, falls Xamarin schon installiert war, das Xamarin SDK ist aus dem BETA-Channel und hat die Version 3.9.41 – falls die Meldung kommt, dass ein anderes SDK zur Verfügung steht, dann drückt bitte unbedingt “Abbrechen”, denn dann hattet ihr den Release, oder Beta Channel (wie ich z. B.) für Updates eingestellt.
Wenn alles gut geht, dann ist unser Projekt verfügbar.
clip_image022

Der Android Emulator

Wow, das klappt jetzt offenbar ohne Probleme, aber es wäre ratsam, dem Browserfenster, mit dem Link:
welches nach der Installation von Xamarin aufgepoppt ist, etwas Aufmerksamkeit zu widmen, hier steht nämlich:
“Please make sure that the following project property is NOT checked: Project -> Properties -> Android Options -> "Use Fast Deployment (debug mode only)"
Nun, wenn das schon ausdrücklich erwähnt wird, dann sollte man sich auch daran halten. ACHTUNG! Die CheckboxIST per default gesetzt, also weg mit dem Häkchen!
clip_image024
Jetzt fällt mir nicht mehr viel ein, außer:
· Das Android Projekt als Startprojekt festlegen und
· die Solution komplett erstellen.
Nun noch den Android Emulator starten - dieser scheint zu etwaigen bereits existierenden Emulatoren in dem (gewohnten) Dropdown in der Toolbar als “VS Emulator Android Phone“ bzw. “"VS Emulator Android Tablet” auf.
clip_image025
Gleich einmal auf den “VS Emulator Android Phone” draufgeklickt und was dann zu sehen ist, freut den “mobile Developer” gleich einmal ungemein: Es passiert wirklich etwas - nämlich im Output Fenster – und es kommt auch gleich eine Dialogbox dazu.
clip_image027
Nun, was ist ein Emulator für ein Android Device, ohne Internet? Eben, also auf den „Yes“-Button geklickt und ein wenig gewartet (eine gefühlte Ewigkeit, es waren aber dann doch nur ca. 2 Minuten), das Resultat aber nahezu BERAUSCHEND:
clip_image029 clip_image031
Der Emulator wie er sein sollte, mit der Xamarin.Forms Applikation!

 

Zusammenfassung

Visual Studio 15 und Xamarin waren schon bisher eine sehr gute Kombination, wenn es um mobile, native Entwicklung gegangen ist. Mit der Integration des Android Emulators ist das Erlebnis für Entwickler noch einmal besser geworden. Ich freue mich auf viele weitere Applikationen, die mit dieser Kombination erstellt werden.

CSharpCodeFormatter