Unit Testing Roger Boesch Technology Solution Professional Developer
Unit Testing Roger Boesch Technology Solution Professional Developer Tools Microsoft Schweiz Gmb. H blogs. msdn. com/rogerboesch
Agenda Einführung in Unit Testing mit Visual Studio Team System Unit Testing Framework (Not so) Simple Unit Testing Data Driven Unit Testing Best Practices BICEP – Das richtige Testen CORRECT – Boundary Conditions Mock Objekte Plattform Unit Testing ASP. Net, Silverlight 2. 0, Windows Mobile
Unit Testing lohnt sich immer… 120 Produktivität 100 Programmierer I: Ohne Unit Tests Tester: Gefundene Fehler Fazit 80 60 40 Programmierer II: Mit Unit Tests 20 0 Zeit
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 Werten Vergleichen des Ergebnisses Kombination von Unit Tests Bilden von Szenarios
Die 10 besten Ausreden Einfü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!
Was bewirkt Unit Testing? Einführung in Unit Testing Frühes und ständiges Testen wird ermöglicht Stehen nach jeder Änderung zur Verfügung Sind in ihrer Gesamtheit aussagekräftig Unterstützen und fördern Refactoring Fördert Einfachheit der einzelnen Methoden Sorgt für einen verbesserten Software Entwicklungs Prozess Kombination von Code und Unit Tests fördert Wartbarkeit und Austauschbarkeit
Ist es wirklich so einfach? Einführung in Unit Testing Sinnhaftigkeit der Tests ( Was testet man? ) Problembereiche Testen von Benutzeroberflächen schwierig MVC Design Pattern hilft ein wenig weiter Schwierige Abgrenzungen (Bsp. Datenbanken) Nebenläufigkeit (Threads) bereiten Probleme Lösungsansatz: Mock-Objekte (to mock: engl. für nachahmen) Einschränkung Testen des “grossen Ganzen” nicht möglich Ersetzen keine Integrations- und Akzeptanz -Tests
Test Driven Development Einführung in Unit Testing Motto: Rot Grün Refactoring Schreibe 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 Beispiel Unit Testing mit Visual Studio Team System using System; public class Cmp { public static int Largest(int[] list) { … } } Welche Tests sind notwendig/sinnvoll?
Zu testende Varianten Unit Testing mit Visual Studio Team System Reihenfolge unabhängig 7, 8, 9 9 8, 7, 9 9 9, 8, 7 9 Mehrere gleiche Einträge 7, 9, 8, 9 9 Nur eine Nummer 1 1 Negative Nummern -9, -8, -7 Leere Liste null ?
Unit Testing mit Visual Studio Team System Roger Boesch Technology Solution Professional Developer Tools Microsoft Schweiz Gmb. H
Data Driven Unit Tests Unit Testing mit Visual Studio Team System Vorteile Schnell erweiterbar durch zusätzliche Datensätze Einfach zu implementieren Komplett ins Testing Framework von VSTS integriert Durch „Nicht“-Programmierer erweiterbar Aufbau der Datenbank Die notwendigen Felder Programmierung Einsatz des Data. Source Properties Zugriff auf die Daten: Der Test. Context
Data Driven Unit Tests mit Visual Studio Team System Roger Boesch Technology Solution Professional Developer Tools Microsoft Schweiz Gmb. H
Das richtige Testen! Unit Testing Best Practices Right BICEP Right: 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 Practices CORRECT Boundaries Conformance: 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 Mock Objekte Stubs Implementieren eines Interfaces und liefern von Dummy-Werten Fakes Erlaubt die Simulieren des echten Verhaltens Frage Dich immer! • Ist ein Mock Objekt wirklich notwendig? • Hilft ev. ein Refactoring/Redesign?
Manchmal ist es nicht so einfach Unit Testing Best Practices Mock Objekte Stubs Implementieren eines Interfaces und liefern von Dummy-Werten Fakes Erlaubt 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 Practices public static string Days. From. Now(Date. Time last) { Time. Span span = Date. Time. Now - last; switch (span. Days) { case 0: return "Heute"; case 1: return "Gestern"; default: return span. Days + " Tage vorher"; } } Was ist hier am Sinnvollsten ?
Merkmaler guter Unit Tests Unit Testing Best Practices Tests müssen schnell sein Ansonsten 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 Testing Silverlight 2. 0, Windows Mobile, ASP. Net … … solange die Zeit reicht Roger Boesch Technology Solution Professional Developer Tools Microsoft Schweiz Gmb. H
Unit 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 aufzeigt Bereinige den Fehler Lass alle Unit Tests erneut laufen! Nach erfolgreichem Kompilieren bei jeder Code Änderung Vor dem Einchecken in die Versions Kontrolle VSTS kennt Check-In Policies!
Weiterführende Informationen zum Thema Links Software Tester Team Center http: //msdn 2. microsoft. com/en-us/teamsystem/aa 718941. aspx Working with Unit Tests http: //msdn 2. microsoft. com/en-us/library/ms 182515(VS. 80). aspx Guidelines for Test Driven Development http: //msdn 2. microsoft. com/en-us/library/aa 730844(VS. 80). aspx Unit Testing für C++ Code http: //www. codeguru. com/columns/kate/article. php/c 11893/ Bücher zum Thema Software 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.
- Slides: 23