Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

43
FÜR DESKTOPAPPS MEIN WERKZEUGKASTEN

Transcript of Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Page 1: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

FÜR DESKTOPAPPS

MEIN WERKZEUGKASTEN

Page 2: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Der Sprecher

Hendrik LöschSenior Consultant & [email protected]@HerrLoeschJust-About.Net

Page 3: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

WARNUNG

Die geschilderten Vor- und Nachteile sind rein subjektiv und auf den Arbeitsablauf des

Autors zugeschnitten.

Page 4: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

€ Kostenfrei nutzbar€ Kostenfrei mit Premiumfeatures€ Kostenpflichtig

Persönlicher Favorit

Page 5: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

TASKS

Page 6: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Speclog

Erfassung und Aufbereitung von Anforderungen auf Basis einer dynamischen Story Map.

+ Sehr einfach zu bedienen.+ Bietet Übersicht über alle Anforderungen.+ Export nach Excel, Html und TFS.

o 100€ pro Nutzero Benötigt Einarbeitung

- Lässt einige grundlegende Komfortfunktionen vermissen (Undo/Redo)

Page 7: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Powerpoint Storyboarding

Zeichnen von UI Mockups mit Hilfe von Powerpoint.

+ Sehr einfach zu bedienen.+ Kann auch ohne Visual Studio genutzt werden.+ Bietet zahlreiche Steuerelemente.+ Ergebnisse können mit TFS Workitems verknüpft werden

o Kein Export in andere Formate (Html, Xaml)

- Aufwändig bei größeren Dialogen- Darstellung echter Interaktion sehr mühselig

Page 8: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Team Foundation Server / Visual Studio Team Services – Taskboard & Backlog

Verschiedene Ansichten zur Planung und Verwaltung von Arbeitspaketen.

+ Übersichtliche, rollenspezifische Sichten.+ Automatische Burndowncharts und Forecasts.+ Epics, Stories, Tasks, Bugs und Testfälle leicht verfügbar.+ Featurebranches können direkt aus Stories heraus erstellt werden.+ Viele Schnittstellen zu anderen Diensten.

o Nur in Kombination mit anderen TFS Features verfügbar.o Benötigt Einarbeitung. o Nicht offlinefähig.

Page 9: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Trello

Verschiedene Ansichten zur Planung und Verwaltung von Arbeitspaketen.

+ Einfach und übersichtlich.+ Alle wichtigen Features kostenlos.+ Frei konfigurierbare Spalten mit Spaltenlimits.+ Zusatzfeatures wie Taskalterung, Checklisten, Kopieren von Inhalten, Tasks per Email anlegen.+ Arbeit sehr gut mit anderen Diensten zusammen.

o Nicht offlinefähig

- Hierarchien von Aufgaben können nur aufwändig abgebildet werden.

Page 10: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Waffle.io

Taskboard des Issuetrackings von Github.

+ Einfach und übersichtlich.+ Alle wichtigen Features kostenlos.+ Frei konfigurierbare Spalten mit Spaltenlimits.+ Änderungen werden automatisch in Githubs Issuetracking übernommen.

o Nicht offlinefähig

- Hierarchien von Aufgaben können nur aufwändig abgebildet werden.

Page 11: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

ETEO

Taskboard für touchfähige Großbildschirme zur Echtzeitsynchronisation verteilter Scrum Teams.

+ Einfach und übersichtlich.+ Anbindung von TFS und Jira

o Wird durch die Saxonia Systems AG mit Ihren Teams bereitgestellt.o Nicht offlinefähig.

- Kann nicht ohne TFS oder Jira arbeiten.

Page 12: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

BUILD, SCV & CO.

Page 13: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Team Foundation Server / Visual Studio Team Services - Continuous Integration

Contionouse Integration umgebung des TFS / VSTS.

+ Vergleichsweise einfach und übersichtlich.+ Alle wichtigen Features kostenlos.+ Gute Übersicht über die Ergebnisse und den Verlauf.+ Bietet viele Erweiterungsmöglichkeiten über Plugins.

o Anpassungen am Projekttemplate können die Konfiguration verkomplizieren.

- In de kostenlosen Variante kommt es gelegentlich zu Verzögerungen bei aufwändigen Builds.

- Einsatz für nicht Microsofttechnologien noch nicht ganz ausgereift.

Page 14: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Appveyor

CI Umgebung für .Net Projekte.

+ Sehr einfach und übersichtlich.+ Für Opensource kostenlos.+ Gute Übersicht über die Ergebnisse und den Verlauf.+ Gute Zusammenarbeit mit Github.

o Geringe Anpassungmöglichkeiten.

- Ausführung und Dokumentation automatisierter Tests eher rudimentär.

Page 15: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Github

Beliebtester Hostingdienst für Opensource Projekte auf Basis von Git.

+ Sehr große Community.+ Für Opensource kostenlos.+ Wird von vielen Diensten unterstützt.

o Private Repositories kostenpflichtig.

- UI ist bedingt nutzerfreundlich.

Page 16: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Sourcetree

Sehr weit verbreitete GUI für Git

+ Plattformunabhängig+ Gute Abbildung der gängigen Arbeitsabläufe.+ kostenlos

o Wird bei größeren oder vielen Projekten träge.

- Anzeige der Dateihistorie und des Mergings sind verbesserungsfähig.

Page 17: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

GitKraken

Vergleichsweise neue GUI für Git die versucht andere Wege der Darstellung zu gehen.

+ Plattformunabhängig+ Gute Abbildung der gängigen Arbeitsabläufe.+ Auch komplexe Aufgaben können über die UI gelöst werden.+ kostenlos.+ Gute Darstellung der Dateihistorie und Versionsvergleiche.

o Wird bei größeren oder vielen Projekten träge.o Benötigt etwas Einarbeitungszeit.

Page 18: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Conemu

Alternative Windows Console.

+ Bietet eine Vielzahl an Komfortfunktionen (Farbe, Copy&Paste, Tabbing, …)+ Kann mehrere Fenster zeitgleich verwalten.+ Durch Plugins aus dem VS heraus verwendbar.+ Kostenlos.

o Gleicher Befehlssatz wie der Windows Commandprompt.

- Keine Erweiterten Befehle oder Scripting.

Page 19: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

WPF, UI & CO.

Page 20: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Prism 6.0

Framework zur Erstellung modularer Applikationen auf Basis diverser Xaml UI Technologien. Eignet sich besonders für komplexe Großanwendungen.

+ Bootstrapping der Anwendung.+ Regionhandling & Navigation.+ ViewModel Locator.+ Integration von DI Frameworks.+ Modulehandling / Plugins.+ Infrastruktur für Behaviours.+ DelegateCommands.+ Messagebus aka EventAggregator.+ Verschiedene Basisklassen für ViewModels.

o Bei Kleinstanwendungen eher schwergewichtig.

Page 21: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

MVVM Light

Framework zur Erstellung modularer Applikationen auf Basis diverser Xaml UI Technologien.Eignet sich besonders für kleinere Anwendungen.

+ RelayCommands.+ Messagebus aka EventAggregator.+ Verschiedene Basisklassen für ViewModels.+ Design Time Data

o Die Applikationsinfrastruktur für Navigation und Bootstrapping ist nicht Teil des Frameworks.

Page 22: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Unitycontainer

IoC Container der sehr gut in Kombination mit Prism zusammen arbeitet.

+ Es gibt nur einen Typen bei dem Typen registriert und aufgelöst werden.+ Diverse Möglichkeiten um Einfluss auf die Lebenszeit von Instanzen zu nehmen.+ XML Konfiguration möglich.+ Automatische Registrierung bestimmter Typen einer Assembly möglich.+ Einsatz aspektorientierter Programmierung möglich.

o Es gibt weitaus schnellere IoC Container.o AOP wird zur Laufzeit vorgenommen und ist dadurch vergleichsweise langsam.

- Wird aktuell nicht sehr aktiv gepflegt.

Page 23: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Autofac

Umfangreicher IoC Container der sehr gut mit anderen Frameworks kombiniert werden kann.

+ Vergleichsweise schnelle Auflösung von Typen.+ Sehr umfangreiche Möglichkeiten um Einfluss auf die Lebenszeit von Instanzen zu nehmen.+ Automatische Registrierung bestimmter Typen einer Assembly möglich.+ Für diverse .Net Plattformen verfügbar.+ Konfiguration per XML und Json möglich.+ Eigene Modulinfrastruktur.+ Hervorragende Dokumentation und Pflege.

o Etwas aufwändig mit Prism zu verwenden.o Registrierung und Auflösung von Typen geschieht über unterschiedliche Klassen.

Page 24: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

DATEN & CO.

Page 25: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Entity Framework

public IQueryable<Place> GetPlaces(int categoryId) { var places = this.dataBase.CategoryPlace

.Where(x => x.CategoryId == categoryId);

return this.dataBase.Place.Where(x => places.Any(p => p.PlaceId == x.Id));

}

public Language GetLanguage(int languageId) { return this.dataBase.Language.Find(languageId); }

Sehr umfangreicher objektrelationaler Mapper für diverse .Net Plattformen.

+ Sehr einfach und intuitiv zu nutzen.+ Gute Konfigurationsmöglichkeiten.+ Sowohl für kleine als auch große Projekte geeignet.+ Sehr aktive Community.

o Einsatz mit Nicht Microsoft Datenbanken gelegentlich schwierig.o Einfachheit täuscht darüber hinweg wie schnell man Performanceschwachstellen entwickeln kann.

- Verwirrende Releasestrategie der unterschiedlichen Versionen.

Page 26: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

AutoMapper

Werkzeug zum automatischen Mappen von Daten aus einem Datenmodell in ein anderes.

+ Spart viel Zeit bei repetitiven Aufgaben.+ Bei Namensgleichheit der Properties müssen diese nicht konfiguriert werden.+ Intelligenter Umgang mit unterschiedlichen Datentypen.

- Verschiedenste Möglichkeiten der Konfiguration im Internet beschrieben die nicht mehr alle gültig sind.- Fehlergründe für Mapping gelegentlich schwer zu finden.

var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());var mapper = new Mapper(config);OrderDto dto = mapper.Map<OrderDto>(order);

Page 27: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

AutoMapper.EF6

Erweiterung des AutoMappers um Aufwände von wiederkehrender Aufgaben in Kombination mit Entity Framework zu verringern.

+ Vereinfacht wiederkehrende Aufgaben im Zusammenahng mit Entity Framework 6 noch weiter.

- Nur EF6 wird unterstützt.

var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());

IEnumerable<OrderDto> dtos = context.Orders.ProjectToList<OrderDto>(config);

Page 28: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

TEST, QUALITÄT & CO.

Page 29: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Team Foundation Server / Visual Studio Team Services

Tests sind integraler Bestandteile der Aufgabenverwaltung und werden über ein Webfrontend verwaltet. Automatisierte Tests können, ohne großen Aufwand, direkt in der Cloud ausgeführt werden.

+ Tests und Features können direkt verknüpft werden.+ Eindeutige Nachverfolg- / Nachvollziehbarkeit.+ Anbindung an Tools wie Excel.

o keine Offlinefähigkeit

- Halbautomatische Tests wie mit dem Test Manager sind nicht möglich.- Übersichtlichkeit kann bei vielen Tests verloren gehen.

Page 30: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

NCrunch

Werkzeug mit dem automatisierte Tests kontinuierlich während der Programmierung ausgeführt werden.

+ Sehr schnelle Feedbackzyklen.+ Volle Integration ins Visual Studio.+ Sehr klare Darstellung der Testabdeckung und möglicher Fehlerstellen.+ Out-of-the-box Unterstützung für MS Test, NUnit, XUnit.net+ Umfangreiche Konfigurationsmöglichkeiten.

o Nicht für Integrationstests geeignet.o Funktionale UI

- Zugriffe auf das Dateisystem aus Tests heraus führen häufig zu Fehlern.

Page 31: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Xaml Styler

Plugin für Visual Studio um XAML Code automatisch zu formatieren.

+ Sehr einfach und leichtgewichtig.+ Xaml Dateien sind besser lesbar.

o Reformatierung des Codes kann zu Problemen bei Code-Reviews führen.

- Sehr große Dateien (>10k Zeilen) können das VS zum Absturz bringen.

Page 32: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

MS Test

[TestClass] public class PersonValidationTests{ [TestMethod]  public void Error_text_shall_be_provided()  { var sut = new Person();               Assert.IsNotNull(sut["FirstName"]); Assert.IsNotNull(sut["LastName"]); Assert.IsNotNull(sut["BirthDate"]);  }}

Testautomatisierungsframework des Visual Studios.

+ Gut geeignet für UI und Integrationstests+ Tests können ohne Zusatzaufwand im TFS Build ausgeführt werden.+ Code Coverage kann leicht erfasst werden.

o Interne Struktur von MS Test lässt nahezu keine Erweiterungen zu.

- Funktionalität unterscheidet sich von Plattform zu Plattform.

- Lässt diverse Standardfeatures moderner XUnit Frameworks vermissen (parametrisierte Tests, Auswertung von Exceptions, Propertybased Tests).

Page 33: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

NUnit

[TestFixture] public class PersonValidationTests{  [Test]  public void Error_text_shall_be_provided()  { var sut = new Person();               Assert.That(sut["FirstName"], Is.Not.Null); Assert.That(sut["LastName"], Is.Not.Null); Assert.That(sut["BirthDate"], Is.Not.Null); }}

Sehr leistungsfähiges XUnit Testing Framework.

+ Gut geeignet für Unit und Integrationstests.+ Wird von vielen gängigen Tools unterstützt.+ Bietet die meisten Feautres der gängigen XUnit Frameworks.+ Ist sehr gut erweiterbar+ Kann für alle gängigen .Net Plattformen eingesetzt werden.

o Es wird ein Adapter benötigt um Tests in TFS und VS ausführen zu können (per NuGet installierbar)

Page 34: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Dynamic Specs

public class WhenPersonSelectionIsShown : Specifies<PersonSelectionViewModel> { public override void Given() { this.AvailablePersons = new List<Person>(){new Person()};

var repository = this.GetInstance<IRepository>();

A.CallTo(() => repository.GetPersons()).Returns(this.AvailablePersons); }

public override void When() { this.SUT.OnShow(); }

[Test] public void ThenAllAvailablePersonsAreShown() { Assert.AreEqual(this.AvailablePersons.Count(), this.SUT.Persons.Count()); }

public IEnumerable<Person> AvailablePersons { get; set; } }

Leichtgewichtige Erweiterung von NUnit und MS Test um Tests in BDD Stil zu verfassen.

+ Bietet Automocking.+ Sehr umfangreich und leicht erweiterbar.+ Erlaubt lesbarere Tests.+ Ist gut erweiterbar+ Leichtgewichtig.

o bietet vergleichsweise wenige Features moderner BDD Frameworks.

Page 35: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

MS Test Coded UI Tests

Im Visual Studio integriertes Werkzeug zum automatisierten Testen von Applikationen auf UI-Ebene.

+ Sehr schnell einsatzfähig.+ Bietet eine einfache Möglichkeit der UI Automation.

o um wirklich umfassend eingesetzt werden zu können braucht es viel mehr Übung als Anfangs offensichtlich.o es empfiehlt sich die UI Map als Ausgangspunkt für eigenen Code zu verwenden.

- UI-Maps werden schnell unübersichtlich.- Das Tool „vergisst“ gelegentlich Steuerelemente.- Parameterübergabe an Methoden ungewöhnlich.- Refaktoring von UI-Maps ist sehr aufwändig.

Page 36: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Specflow

BDD-Framework mit dem Anforderungen und Tests verschmolzen werden können.

+ Anforderungen werden klarsprachlich definiert und sind der Ausgangspunkt für automatisierte Tests.+ Editor der Featurefiles verfügt über Autover- vollständigung und Code Highlightning.+ Kann mit diversen Testingframeworks genutzt werden.+ Macht die UI Maps der Coded UI Tests einfacher nutzbar.

o Das gesamte Team muss an der Pflege und Erstellung der Dateien beteiligt werden.

- Kopplung von Text und Test nur im Visual Studio verfügbar.

Page 37: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Fake it Easy

Sehr einfaches und leicht verständliches Mocking Framework welches einen umfassenden Einsatz von Interfaces verlangt.

+ Sehr einfach nutz und erlernbar.+ Tests mit FakeItEasy sind sehr gut lesbar.+ Sehr aktive Community.+ Weitreichend von anderen Frameworks unterstützt.+ Sehr gute Dokumentation.

- Kann keine konkreten Typen mocken.- Kann keine statischen Typen mocken.

Page 38: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Microsoft Fakes

[TestMethod]public void Selected_person_shall_be_removed_from_database(){ using(ShimsContext.Create()) { bool wasCalled = false; ShimPersonRepository.AllInstances.Delete =

x => { wasCalled = true; }; var sut = new PersonManagementViewModel(); sut.SelectedPerson = new Person();

sut.DeleteCommand.Execute(null); }

Assert.IsTrue(wasCalled, "Was not called!");}

Mockingfeature des Visual Studios mit dem auch konkrete Implementierungen ersetzt werden können.

+ Kann konkrete Typen mocken.+ Kann statische Typen mocken.

o Braucht ein Dupplikat der zu mockenden Assembly.

- Tests sind vergleichsweise schwer lesbar.- Mocking ist sehr langsam wenn Shims verwendet werden.

Page 39: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Object Filler

public class Person{ public string Name { get; set; } public string LastName { get; set; }}

public class HelloFiller{ public void FillPerson() { var pFiller = new Filler<Person>(); pFiller.Setup() .OnProperty(p => p.Name).Use("John") .OnProperty(p => p.LastName).Use(new RealNames(NameStyle.LastName));

var filledPerson = pFiller.Create(); }}

Framework zur automatisierten Generierung von Daten.

+ Sehr einfach verständlich.+ Sehr umfangreich.+ Bietet Implementierungen für viele Standardfälle.+ Gute Plugin-Infrastruktur um selbst Erweiterungen vorzunehmen.+ Gute Dokumentation+ Aktive Community

o Aufwändige Konfiguration führen zu repetitivem Code.

- Keine direkte Integration in Testingframeworks.

Page 40: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

CODE QUALITÄT

Page 41: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

ResharperBietet verschiedenste Möglichkeiten um Quellcode zu analysieren, refaktorisieren und zu verbessern.

Page 42: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

Der Sprecher

Hendrik LöschSenior Consultant & [email protected]@HerrLoeschJust-About.Net

Page 43: Mein Wekzeugkasten für Desktopapps - Hendrik Lösch @DWX2016

View ViewModel ModelDataBinding

BindableBaseValidateableBindableBase

ViewViewModel Model

DataBinding

„Entity ViewModel“