Unit TestingUnit Testing
Roger BoeschTechnology Solution Professional Developer ToolsMicrosoft Schweiz GmbH
blogs.msdn.com/rogerboesch
Roger BoeschTechnology Solution Professional Developer ToolsMicrosoft Schweiz GmbH
blogs.msdn.com/rogerboesch
AgendaAgendaEinführung in Unit TestingUnit Testing mit Visual Studio Team System
Unit Testing Framework(Not so) Simple Unit TestingData Driven Unit Testing
Unit Testing Best PracticesBICEP – Das richtige TestenCORRECT – Boundary ConditionsMock Objekte
Plattform Unit TestingASP.Net, Silverlight 2.0, Windows Mobile
Einführung in Unit TestingUnit Testing mit Visual Studio Team System
Unit Testing Framework(Not so) Simple Unit TestingData Driven Unit Testing
Unit Testing Best PracticesBICEP – Das richtige TestenCORRECT – Boundary ConditionsMock Objekte
Plattform Unit TestingASP.Net, Silverlight 2.0, Windows Mobile
Unit Testinglohnt sich immer…Unit Testinglohnt sich immer…
Series1
0
20
40
60
80
100
120
Programmierer I: Ohne Unit TestsTester: Gefundene FehlerFazitProgrammierer II: Mit Unit Tests
Zeit
Pro
du
kti
vit
ät
Was sind eigentlich Unit Tests?Einführung in Unit Testing
Was sind eigentlich Unit Tests?Einführung in Unit Testing
Prüfen von Units (Modulen)Autarke Code Einheiten (Bsp. Methode)Nur sinnvolle Tests (Bsp. Keine Getter/Setter)Automatisierbar und wiederholbar
Whitebox Testing (Einblick in Code)Einspeisen von verschiedenen WertenVergleichen des Ergebnisses
Kombination von Unit TestsBilden von Szenarios
Prüfen von Units (Modulen)Autarke Code Einheiten (Bsp. Methode)Nur sinnvolle Tests (Bsp. Keine Getter/Setter)Automatisierbar und wiederholbar
Whitebox Testing (Einblick in Code)Einspeisen von verschiedenen WertenVergleichen des Ergebnisses
Kombination von Unit TestsBilden von Szenarios
Die 10 besten AusredenEinführung in Unit TestingDie 10 besten AusredenEinführung in Unit Testing
Es braucht viel zu viel Zeit um die Tests zu schreiben!Die Tests laufen zu lassen dauert zu lange!Wir verwenden viel Legacy Code, der nicht getestet werden kann!Es ist nicht meine Aufgabe meinen Code zu testen!Ich weiss nicht, was der Code genau tun muss, wie soll ich da Tests schreiben?Der Code lässt sich doch compilieren!Ich werde bezahlt um Code zu schreiben, nicht Tests!Unsere Tester müssen ja auch noch Arbeit haben!Meine Firma erlaubt keine Unit Test auf Live-Systemen!Ja ja, ich schreibe doch bereits Unit Tests!
Es braucht viel zu viel Zeit um die Tests zu schreiben!Die Tests laufen zu lassen dauert zu lange!Wir verwenden viel Legacy Code, der nicht getestet werden kann!Es ist nicht meine Aufgabe meinen Code zu testen!Ich weiss nicht, was der Code genau tun muss, wie soll ich da Tests schreiben?Der Code lässt sich doch compilieren!Ich werde bezahlt um Code zu schreiben, nicht Tests!Unsere Tester müssen ja auch noch Arbeit haben!Meine Firma erlaubt keine Unit Test auf Live-Systemen!Ja ja, ich schreibe doch bereits Unit Tests!
Was bewirkt Unit Testing?Einführung in Unit TestingWas bewirkt Unit Testing?Einführung in Unit Testing
Frühes und ständiges Testen wird ermöglichtStehen nach jeder Änderung zur VerfügungSind in ihrer Gesamtheit aussagekräftigUnterstützen und fördern RefactoringFördert Einfachheit der einzelnen MethodenSorgt für einen verbesserten Software Entwicklungs ProzessKombination von Code und Unit Tests fördert Wartbarkeit und Austauschbarkeit
Frühes und ständiges Testen wird ermöglichtStehen nach jeder Änderung zur VerfügungSind in ihrer Gesamtheit aussagekräftigUnterstützen und fördern RefactoringFördert Einfachheit der einzelnen MethodenSorgt für einen verbesserten Software Entwicklungs ProzessKombination von Code und Unit Tests fördert Wartbarkeit und Austauschbarkeit
Ist es wirklich so einfach?Einführung in Unit TestingIst es wirklich so einfach?Einführung in Unit Testing
Sinnhaftigkeit der Tests ( Was testet man?)
ProblembereicheTesten von Benutzeroberflächen schwierig
MVC Design Pattern hilft ein wenig weiter
Schwierige Abgrenzungen (Bsp. Datenbanken)Nebenläufigkeit (Threads) bereiten ProblemeLösungsansatz: Mock-Objekte (to mock: engl. für nachahmen)
EinschränkungTesten des “grossen Ganzen” nicht möglichErsetzen keine Integrations- und Akzeptanz -Tests
Sinnhaftigkeit der Tests ( Was testet man?)
ProblembereicheTesten von Benutzeroberflächen schwierig
MVC Design Pattern hilft ein wenig weiter
Schwierige Abgrenzungen (Bsp. Datenbanken)Nebenläufigkeit (Threads) bereiten ProblemeLösungsansatz: Mock-Objekte (to mock: engl. für nachahmen)
EinschränkungTesten des “grossen Ganzen” nicht möglichErsetzen keine Integrations- und Akzeptanz -Tests
Test Driven DevelopmentEinführung in Unit TestingTest Driven DevelopmentEinführung in Unit Testing
Motto: Rot Grün RefactoringSchreibe einen kleinen Test für den nächsten zu implementierenden Funktionalitätshappen. Dieser Test sollte nicht funktionieren. Erfülle den Test mit möglichst wenig Code, um schnell wieder zum "grünen Balken" (alle Tests laufen) zurückzukehren. Räume den Code auf! Dazu gehört das Entfernen von Duplikaten, Einführung von notwendigen Abstraktionen und Umsetzen der Code Konventionen. Ziel dieses Aufräumens ist die einfache Form des Codes.
Motto: Rot Grün RefactoringSchreibe einen kleinen Test für den nächsten zu implementierenden Funktionalitätshappen. Dieser Test sollte nicht funktionieren. Erfülle den Test mit möglichst wenig Code, um schnell wieder zum "grünen Balken" (alle Tests laufen) zurückzukehren. Räume den Code auf! Dazu gehört das Entfernen von Duplikaten, Einführung von notwendigen Abstraktionen und Umsetzen der Code Konventionen. Ziel dieses Aufräumens ist die einfache Form des Codes.
Ein erstes BeispielUnit Testing mit Visual Studio Team System
Ein erstes BeispielUnit Testing mit Visual Studio Team Systemusing System;
public class Cmp{
public static int Largest(int[] list){
…}
}
using System;
public class Cmp{
public static int Largest(int[] list){
…}
}
Welche Tests sind notwendig/sinnvoll?Welche Tests sind notwendig/sinnvoll?
Zu testende VariantenUnit Testing mit Visual Studio Team System
Zu testende VariantenUnit Testing mit Visual Studio Team System
Reihenfolge unabhängig7,8,9 9 8,7,9 9 9,8,7 9
Mehrere gleiche Einträge7,9,8,9 9
Nur eine Nummer1 1
Negative Nummern-9,-8,-7 -7
Leere Listenull ?
Reihenfolge unabhängig7,8,9 9 8,7,9 9 9,8,7 9
Mehrere gleiche Einträge7,9,8,9 9
Nur eine Nummer1 1
Negative Nummern-9,-8,-7 -7
Leere Listenull ?
Unit Testing mitVisual Studio Team System
Unit Testing mitVisual Studio Team System
Roger BoeschTechnology Solution Professional Developer ToolsMicrosoft Schweiz GmbH
Roger BoeschTechnology Solution Professional Developer ToolsMicrosoft Schweiz GmbH
Data Driven Unit TestsUnit Testing mit Visual Studio Team System
Data Driven Unit TestsUnit Testing mit Visual Studio Team System
VorteileSchnell erweiterbar durch zusätzliche DatensätzeEinfach zu implementierenKomplett ins Testing Framework von VSTS integriertDurch „Nicht“-Programmierer erweiterbar
Aufbau der DatenbankDie notwendigen Felder
ProgrammierungEinsatz des DataSource PropertiesZugriff auf die Daten: Der TestContext
VorteileSchnell erweiterbar durch zusätzliche DatensätzeEinfach zu implementierenKomplett ins Testing Framework von VSTS integriertDurch „Nicht“-Programmierer erweiterbar
Aufbau der DatenbankDie notwendigen Felder
ProgrammierungEinsatz des DataSource PropertiesZugriff auf die Daten: Der TestContext
Data Driven Unit Tests mitVisual Studio Team System
Data Driven Unit Tests mitVisual Studio Team SystemRoger Boesch
Technology Solution Professional Developer ToolsMicrosoft Schweiz GmbH
Roger BoeschTechnology Solution Professional Developer ToolsMicrosoft Schweiz GmbH
Das richtige Testen!Unit Testing Best PracticesDas richtige Testen!Unit Testing Best Practices
Right BICEPRight: Sind die Testergebnisse korrekt?B: Sind die Boundary Conditions korrekt?I: Kann invers getestet werden?C: Kann Cross-Check getestet werden?E: Können Fehler (Errors) erzeugt werden?P: Liegt die Performance in der Toleranz?
Right BICEPRight: Sind die Testergebnisse korrekt?B: Sind die Boundary Conditions korrekt?I: Kann invers getestet werden?C: Kann Cross-Check getestet werden?E: Können Fehler (Errors) erzeugt werden?P: Liegt die Performance in der Toleranz?
Das richtige Testen!Unit Testing Best PracticesDas richtige Testen!Unit Testing Best Practices
CORRECT BoundariesConformance: Stimmt das Format?Ordering: Spielt die Reihenfolge eine Rolle?Range: Liegt der Wert in einem definierten Bereich?Reference: Nutzt der Code externe Ressourcen?Existence: Existiert ein bestimmter Wert?Cardinality: Stimmt die Anzahl?Time: Geschieht alles in der Zeit, zur Zeit?
CORRECT BoundariesConformance: Stimmt das Format?Ordering: Spielt die Reihenfolge eine Rolle?Range: Liegt der Wert in einem definierten Bereich?Reference: Nutzt der Code externe Ressourcen?Existence: Existiert ein bestimmter Wert?Cardinality: Stimmt die Anzahl?Time: Geschieht alles in der Zeit, zur Zeit?
Manchmal ist es nicht so einfach…Unit Testing Best Practices
Manchmal ist es nicht so einfach…Unit Testing Best PracticesMock Objekte
StubsImplementieren eines Interfaces und liefern von Dummy-Werten
FakesErlaubt die Simulieren des echten Verhaltens
Frage Dich immer!• Ist ein Mock Objekt wirklich notwendig?• Hilft ev. ein Refactoring/Redesign?
Mock ObjekteStubs
Implementieren eines Interfaces und liefern von Dummy-Werten
FakesErlaubt die Simulieren des echten Verhaltens
Frage Dich immer!• Ist ein Mock Objekt wirklich notwendig?• Hilft ev. ein Refactoring/Redesign?
Manchmal ist es nicht so einfachUnit Testing Best Practices
Manchmal ist es nicht so einfachUnit Testing Best PracticesMock Objekte
StubsImplementieren eines Interfaces und liefern von Dummy-Werten
FakesErlaubt die Simulieren des echten Verhaltens
Frage Dich immer!• Ist ein Mock Objekt wirklich notwendig?• Hilft ev. ein Refactoring/Redesign?
Mock ObjekteStubs
Implementieren eines Interfaces und liefern von Dummy-Werten
FakesErlaubt die Simulieren des echten Verhaltens
Frage Dich immer!• Ist ein Mock Objekt wirklich notwendig?• Hilft ev. ein Refactoring/Redesign?
Zeit ist nicht gleich Zeit…Unit Testing Best PracticesZeit ist nicht gleich Zeit…Unit Testing Best Practices public static string DaysFromNow(DateTime last) {
TimeSpan span = DateTime.Now - last;switch (span.Days){
case 0:return "Heute";
case 1: return "Gestern";
default:return span.Days + " Tage
vorher";}
}
public static string DaysFromNow(DateTime last) {
TimeSpan span = DateTime.Now - last;switch (span.Days){
case 0:return "Heute";
case 1: return "Gestern";
default:return span.Days + " Tage
vorher";}
}
Was ist hier am Sinnvollsten ?Was ist hier am Sinnvollsten ?
Merkmaler guter Unit TestsUnit Testing Best PracticesMerkmaler guter Unit TestsUnit Testing Best Practices
Tests müssen schnell seinAnsonsten werden sie nicht so oft gestartet
Separieren oder simulieren von Abhängikeiten Immer Mock-Objekte oder Stubs einsetzen
Limitieren des Scopes Ein Test testet jeweils nur einen Fall
Tests müssen isoliert ablaufen können Die Reihenfolge der Tests darf keine Rolle
spielen
Tests sollten selbsterklärend sein Erkenne ich sofort was getestet wird?
Tests müssen schnell seinAnsonsten werden sie nicht so oft gestartet
Separieren oder simulieren von Abhängikeiten Immer Mock-Objekte oder Stubs einsetzen
Limitieren des Scopes Ein Test testet jeweils nur einen Fall
Tests müssen isoliert ablaufen können Die Reihenfolge der Tests darf keine Rolle
spielen
Tests sollten selbsterklärend sein Erkenne ich sofort was getestet wird?
Plattform Unit TestingSilverlight 2.0, Windows Mobile, ASP.Net …… solange die Zeit reicht
Plattform Unit TestingSilverlight 2.0, Windows Mobile, ASP.Net …… solange die Zeit reicht
Roger BoeschTechnology Solution Professional Developer ToolsMicrosoft Schweiz GmbH
Roger BoeschTechnology Solution Professional Developer ToolsMicrosoft Schweiz GmbH
Unit Tests: Was bleibt noch?Unit Testing Best PracticesUnit Tests: Was bleibt noch?Unit Testing Best Practices
Wie oft soll ich meine Tests laufen lassen?Nach dem Schreiben einer neuen Methode (TDD)Bei einem Fehler
Schreibe einen Test der den Fehler aufzeigtBereinige den FehlerLass alle Unit Tests erneut laufen!
Nach erfolgreichem Kompilieren bei jeder Code ÄnderungVor dem Einchecken in die Versions Kontrolle
VSTS kennt Check-In Policies!
Wie oft soll ich meine Tests laufen lassen?Nach dem Schreiben einer neuen Methode (TDD)Bei einem Fehler
Schreibe einen Test der den Fehler aufzeigtBereinige den FehlerLass alle Unit Tests erneut laufen!
Nach erfolgreichem Kompilieren bei jeder Code ÄnderungVor dem Einchecken in die Versions Kontrolle
VSTS kennt Check-In Policies!
Weiterführende Informationen zum ThemaWeiterführende Informationen zum ThemaLinks
Software Tester Team Centerhttp://msdn2.microsoft.com/en-us/teamsystem/aa718941.aspx
Working with Unit Testshttp://msdn2.microsoft.com/en-us/library/ms182515(VS.80).aspx
Guidelines for Test Driven Developmenthttp://msdn2.microsoft.com/en-us/library/aa730844(VS.80).aspx
Unit Testing für C++ Codehttp://www.codeguru.com/columns/kate/article.php/c11893/
Bücher zum ThemaSoftware Testing with Visual Studio Team System (ISBN 0470149787 )
Pragmatic Unit Testing (http://pragprog.com/starter_kit)
LinksSoftware Tester Team Center
http://msdn2.microsoft.com/en-us/teamsystem/aa718941.aspx
Working with Unit Testshttp://msdn2.microsoft.com/en-us/library/ms182515(VS.80).aspx
Guidelines for Test Driven Developmenthttp://msdn2.microsoft.com/en-us/library/aa730844(VS.80).aspx
Unit Testing für C++ Codehttp://www.codeguru.com/columns/kate/article.php/c11893/
Bücher zum ThemaSoftware Testing with Visual Studio Team System (ISBN 0470149787 )
Pragmatic Unit Testing (http://pragprog.com/starter_kit)
© Microsoft Corporation. All rights reserved.This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.