Abbildung von: The Art of Unit Testing - MITP

The Art of Unit Testing

Deutsche Ausgabe
2. Auflage
Erschienen am 28. Januar 2015
312 Seiten
E-Book
PDF ohne DRM
978-3-8266-8721-1 (ISBN)
33,99 €inkl. 7% MwSt.
Systemvoraussetzungen
für PDF ohne DRM
E-Book Einzellizenz
Als Download verfügbar
Lesbare, wartbare und zuverlässige Tests entwickeln
Fakes, Stubs, Mock-Objekte und Isolation-(Mocking-)Frameworks
Einfache Dependency-Injection-Techniken und das Refactoring von Legacy Code

Sie wissen, dass Sie Unit Tests durchführen sollten - warum machen Sie es noch nicht? Wenn Sie Anfänger auf dem Gebiet der Unit Tests sind, wenn Sie Unit Tests mühsam finden oder wenn Sie, gemessen am Aufwand, einfach kein ausreichendes Ergebnis erzielen, dann sollten Sie dieses Buch lesen.

Roy Osherove führt Sie Schritt für Schritt vom Schreiben Ihres ersten, einfachen Unit Tests bis hin zum Erstellen kompletter Test-Sets, die wartbar, lesbar und zuverlässig sind. Sie werden schnell zu fortgeschrittenen Themen wie Mocks und Stubs hingeführt, während Sie die Verwendung von Isolation-(Mocking-)Frameworks wie Moq, FakeItEasy und Typemock Isolator erlernen. Sie erfahren eine Menge zu Testmustern und zur Testorganisation, führen Refactoring durch und lernen, wie man »untestbaren« Code testet. Nebenbei zeigt Ihnen der Autor das Integration Testing sowie Techniken zum Testen mit Datenbanken.

Die Beispiele im Buch verwenden C#, sind aber auch für jeden nützlich, der eine Sprache mit statischen Typen wie Java oder C++ benutzt.

Aus dem Inhalt:
Grundlagen des Unit Testings
Frameworks für das Unit Testing
Einsatz von NUnit
Stubs zum Auflösen von Abhängigkeiten
Interaction Testing mit Mock-Objekten
Isolation-(Mocking-)Frameworks
Testhierarchie und Organisation
Die Säulen guter Unit Tests
Integration von Unit Tests in das Unternehmen
Umgang mit Legacy Code
Design und Testbarkeit
Tools und Frameworks

Stimmen zum Buch:
»Dieses Buch ist etwas Besonderes. Die Kapitel bauen aufeinander auf und entwickeln eine erstaunliche Tiefe.«
- Aus dem Vorwort von Robert C. Martin, cleancoder.com

»Die beste Art, Unit Testing zu lernen. Bereits ein Klassiker auf dem Gebiet.«
- Raphael Faria, LG Electronics

»Bringt Ihnen sowohl die Philosophie des effektiven Unit Testings bei als auch die praktischen Grundlagen.«
- Pradeep Chellappan, Microsoft

»Wenn meine Teammitglieder fragen, wie sie Unit Tests richtig schreiben sollen, antworte ich einfach: mit diesem Buch!«
- Alessandro Campeis, Vimar SpA

Stimmen zum Buch:
»Dieses Buch ist etwas Besonderes. Die Kapitel bauen aufeinander auf und entwickeln eine erstaunliche Tiefe.« - Aus dem Vorwort von Robert C. Martin, cleancoder.com
»Die beste Art, Unit Testing zu lernen. Bereits ein Klassiker auf dem Gebiet.« - Raphael Faria, LG Electronics
»Bringt Ihnen sowohl die Philosophie des effektiven Unit Testings bei als auch die praktischen Grundlagen.« - Pradeep Chellappan, Microsoft
»Wenn meine Teammitglieder fragen, wie sie Unit Tests richtig schreiben sollen, antworte ich einfach: mit diesem Buch!« - Alessandro Campeis, Vimar SpA

Pressestimmen:
" Insgesamt ist das Buch »The Art of Unit Testing« sehr empfehlenswert. Es bietet eine gute Einführung in Unit-Tests und bündelt die gesammelten Erfahrungen des Autors. [...] Sehr gut haben die Kapitel zur Integration in der Organisation und zum Design for Testability gefallen."
freiesMagazin, 07/2015

Reihe
Auflage
2.; überarbeitete Auflage 2015
Sprache
Deutsch
Verlagsort
Frechen
Deutschland
Verlagsgruppe
mitp Verlags GmbH & Co.KG
Zielgruppe
Software-Entwickler für .NET sowie andere Programmiersprachen.
Dateigröße
Dateigröße: 8,34 MB
Schlagworte
ISBN-13
978-3-8266-8721-1 (9783826687211)
Schweitzer Klassifikation
Thema Klassifikation
DNB DDC Sachgruppen
BISAC Klassifikation
Warengruppensystematik 2.0
Roy Osherove berät und trainiert weltweit Entwicklungsteams zum Unit Testing und Test-Driven Development. Darüber hinaus ist er Sprecher bei zahlreichen internationalen Konferenzen.
  • Cover
  • Titel
  • Impressum
  • Inhaltsverzeichnis
  • Vorwort zur zweiten Auflage
  • Vorwort zur ersten Auflage
  • Einleitung
  • Kapitel 1: Die Grundlagen des Unit Testings
  • 1.1 Unit Testing - Schritt für Schritt definiert
  • 1.1.1 Die Bedeutung guter Unit Tests
  • 1.1.2 Wir alle haben schon Unit Tests geschrieben (irgendwie)
  • 1.2 Eigenschaften eines »guten« Unit Tests
  • 1.3 Integrationstests
  • 1.3.1 Nachteile von nicht automatisierten Integrationstests im Vergleich zu automatisierten Unit Tests
  • 1.4 Was Unit Tests »gut« macht
  • 1.5 Ein einfaches Unit-Test-Beispiel
  • 1.6 Testgetriebene Entwicklung
  • 1.7 Die drei Schlüsselqualifikationen für erfolgreiches TDD
  • 1.8 Zusammenfassung
  • Kapitel 2: Ein erster Unit Test
  • 2.1 Frameworks für das Unit Testing
  • 2.1.1 Was Unit-Testing-Frameworks bieten
  • 2.1.2 Die xUnit-Frameworks
  • 2.2 Das LogAn-Projekt wird vorgestellt
  • 2.3 Die ersten Schritte mit NUnit
  • 2.3.1 Die Installation von NUnit
  • 2.3.2 Das Laden der Projektmappe
  • 2.3.3 Die Verwendung der NUnit-Attribute in Ihrem Code
  • 2.4 Sie schreiben Ihren ersten Test
  • 2.4.1 Die Klasse Assert
  • 2.4.2 Sie führen Ihren ersten Test mit NUnit aus
  • 2.4.3 Sie fügen positive Tests hinzu
  • 2.4.4 Von Rot nach Grün: das erfolgreiche Ausführen der Tests
  • 2.4.5 Test-Code-Gestaltung
  • 2.5 Refactoring zu parametrisierten Tests
  • 2.6 Weitere NUnit-Attribute
  • 2.6.1 Aufbau und Abbau
  • 2.6.2 Auf erwartete Ausnahmen prüfen
  • 2.6.3 Das Ignorieren von Tests
  • 2.6.4 Die fließende Syntax von NUnit
  • 2.6.5 Das Festlegen der Testkategorien
  • 2.7 Das Testen auf Zustandsänderungen des Systems statt auf Rückgabewerte
  • 2.8 Zusammenfassung
  • Kapitel 3: Die Verwendung von Stubs, um Abhängigkeiten aufzulösen
  • 3.1 Die Stubs werden vorgestellt
  • 3.2 Die Identifizierung einer Dateisystemabhängigkeit in LogAn
  • 3.3 Die Entscheidung, wie LogAnalyzer am einfachsten getestet werden kann
  • 3.4 Design-Refactoring zur Verbesserung der Testbarkeit
  • 3.4.1 Extrahiere ein Interface, um die dahinter liegende Implementierung durch eine andere ersetzen zu können
  • 3.4.2 Dependency Injection: Injiziere eine Fake-Implementierung in die zu testende Unit
  • 3.4.3 Injiziere einen Fake auf Konstruktor-Ebene (Construktor Injection)
  • 3.4.4 Simuliere Ausnahmen über Fakes
  • 3.4.5 Injiziere ein Fake als Property Get oder Set
  • 3.4.6 Injiziere einen Fake unmittelbar vor einem Methodenaufruf
  • 3.5 Variationen der Refactoring-Technik
  • 3.5.1 Die Verwendung von Extract and Override, um Fake-Resultate zu erzeugen
  • 3.6 Die Überwindung des Kapselungsproblems
  • 3.6.1 Die Verwendung von internal und [InternalsVisibleTo]
  • 3.6.2 Die Verwendung des Attributs [Conditional]
  • 3.6.3 Die Verwendung von #if und #endif zur bedingten Kompilierung
  • 3.7 Zusammenfassung
  • Kapitel 4: Interaction Testing mit Mock-Objekten
  • 4.1 Wertbasiertes Testen versus zustandsbasiertes Testen versus Testen versus Interaction Testing
  • 4.2 Der Unterschied zwischen Mocks und Stubs
  • 4.3 Ein einfaches manuelles Mock-Beispiel
  • 4.4 Die gemeinsame Verwendung von Mock und Stub
  • 4.5 Ein Mock pro Test
  • 4.6 Fake-Ketten: Stubs, die Mocks oder andere Stubs erzeugen
  • 4.7 Die Probleme mit handgeschriebenen Mocks und Stubs
  • 4.8 Zusammenfassung
  • Kapitel 5: Isolation-(Mock-Objekt-)Frameworks
  • 5.1 Warum überhaupt Isolation-Frameworks?
  • 5.2 Das dynamische Erzeugen eines Fake-Objekts
  • 5.2.1 Die Einführung von NSubstitute in Ihre Tests
  • 5.2.2 Das Ersetzen eines handgeschriebenen Fake-Objekts durch ein dynamisches
  • 5.3 Die Simulation von Fake-Werten
  • 5.3.1 Ein Mock, ein Stub und ein Ausflug in einen Test
  • 5.4 Das Testen auf ereignisbezogene Aktivitäten
  • 5.4.1 Das Testen eines Event Listeners
  • 5.4.2 Der Test, ob ein Event getriggert wurde
  • 5.5 Die aktuellen Isolation-Frameworks für .NET
  • 5.6 Die Vorteile und Fallstricke von Isolation-Frameworks
  • 5.6.1 Fallstricke, die man bei der Verwendung von Isolation-Frameworks besser vermeidet
  • 5.6.2 Unlesbarer Testcode
  • 5.6.3 Die Verifizierung der falschen Dinge
  • 5.6.4 Die Verwendung von mehr als einem Mock pro Test
  • 5.6.5 Die Überspezifizierung von Tests
  • 5.7 Zusammenfassung
  • Kapitel 6: Wir tauchen tiefer ein in die Isolation-Frameworks
  • 6.1 Eingeschränkte und uneingeschränkte Frameworks
  • 6.1.1 Eingeschränkte Frameworks
  • 6.1.2 Uneingeschränkte Frameworks
  • 6.1.3 Wie Profiler-basierte uneingeschränkte Frameworks arbeiten
  • 6.2 Werte guter Isolation-Frameworks
  • 6.3 Eigenschaften, die Zukunftssicherheit und Benutzerfreundlichkeit unterstützen
  • 6.3.1 Rekursive Fakes
  • 6.3.2 Ignoriere Argumente als Voreinstellung
  • 6.3.3 Umfangreiches Fälschen
  • 6.3.4 Nicht striktes Verhalten von Fakes
  • 6.3.5 Nicht strikte Mocks
  • 6.4 Isolation-Framework-Design-Antimuster
  • 6.4.1 Konzept-Konfusion
  • 6.4.2 Aufnahme und Wiedergabe
  • 6.4.3 Klebriges Verhalten
  • 6.4.4 Komplexe Syntax
  • 6.5 Zusammenfassung
  • Kapitel 7: Testhierarchie und Organisation
  • 7.1 Automatisierte Builds, die automatisierte Tests laufen lassen
  • 7.1.1 Die Anatomie eines Build-Skripts
  • 7.1.2 Das Anstoßen von Builds und Integration
  • 7.2 Testentwürfe, die auf Geschwindigkeit und Typ basieren
  • 7.2.1 Der menschliche Faktor beim Trennen von Unit und Integrationstests
  • 7.2.2 Die sichere grüne Zone
  • 7.3 Stellen Sie sicher, dass die Tests zu Ihrer Quellcodekontrolle gehören
  • 7.4 Das Abbilden der Testklassen auf den zu testenden Code
  • 7.4.1 Das Abbilden von Tests auf Projekte
  • 7.4.2 Das Abbilden von Tests auf Klassen
  • 7.4.3 Das Abbilden von Tests auf bestimmte Methoden
  • 7.5 Querschnittsbelang-Injektion
  • 7.6 Der Bau einer Test-API für Ihre Applikation
  • 7.6.1 Die Verwendung von Testklassen-Vererbungsmustern
  • 7.6.2 Der Entwurf von Test-Hilfsklassen und -Hilfsmethoden
  • 7.6.3 Machen Sie Ihre API den Entwicklern bekannt
  • 7.7 Zusammenfassung
  • Kapitel 8: Die Säulen guter Unit Tests
  • 8.1 Das Schreiben vertrauenswürdiger Tests
  • 8.1.1 Die Entscheidung, wann Tests entfernt oder geändert werden
  • 8.1.2 Vermeiden Sie Logik in Tests
  • 8.1.3 Testen Sie nur einen Belang
  • 8.1.4 Trennen Sie Unit Tests von Integrationstests
  • 8.1.5 Stellen Sie Code-Reviews mit Codeabdeckung sicher
  • 8.2 Das Schreiben wartbarer Tests
  • 8.2.1 Das Testen privater oder geschützter Methoden
  • 8.2.2 Das Entfernen von Duplizitäten
  • 8.2.3 Die Verwendung von Setup-Methoden in einer wartbaren Art und Weise
  • 8.2.4 Das Erzwingen der Test-Isolierung
  • 8.2.5 Vermeiden Sie mehrfache Asserts für unterschiedliche Belange
  • 8.2.6 Der Vergleich von Objekten
  • 8.2.7 Vermeiden Sie eine Überspezifizierung der Tests
  • 8.3 Das Schreiben lesbarer Tests
  • 8.3.1 Die Benennung der Unit Tests
  • 8.3.2 Die Benennung der Variablen
  • 8.3.3 Benachrichtigen Sie sinnvoll
  • 8.3.4 Das Trennen der Asserts von den Aktionen
  • 8.3.5 Aufbauen und Abreißen
  • 8.4 Zusammenfassung
  • Kapitel 9: Die Integration von Unit Tests in die Organisation
  • 9.1 Schritte, um ein Agent des Wandels zu werden
  • 9.1.1 Seien Sie auf die schweren Fragen vorbereitet
  • 9.1.2 Überzeugen Sie Insider: Champions und Blockierer
  • 9.1.3 Identifizieren Sie mögliche Einstiegspunkte
  • 9.2 Wege zum Erfolg
  • 9.2.1 Guerilla-Implementierung (Bottom-up)
  • 9.2.2 Überzeugen Sie das Management (Top-down)
  • 9.2.3 Holen Sie einen externen Champion
  • 9.2.4 Machen Sie Fortschritte sichtbar
  • 9.2.5 Streben Sie bestimmte Ziele an
  • 9.2.6 Machen Sie sich klar, dass es Hürden geben wird
  • 9.3 Wege zum Misserfolg
  • 9.3.1 Mangelnde Triebkraft
  • 9.3.2 Mangelnde politische Unterstützung
  • 9.3.3 Schlechte Implementierungen und erste Eindrücke
  • 9.3.4 Mangelnde Teamunterstützung
  • 9.4 Einflussfaktoren
  • 9.5 Schwierige Fragen und Antworten
  • 9.5.1 Wie viel zusätzliche Zeit wird der aktuelle Prozess für das Unit Testing benötigen?
  • 9.5.2 Ist mein Job bei der QS in Gefahr wegen des Unit Testing?
  • 9.5.3 Woher wissen wir, dass Unit Tests wirklich funktionieren?
  • 9.5.4 Gibt es denn einen Beweis, dass Unit Testing hilft?
  • 9.5.5 Warum findet die QS immer noch Bugs?
  • 9.5.6 Wir haben eine Menge Code ohne Tests: Wo fangen wir an?
  • 9.5.7 Wir arbeiten mit mehreren Sprachen: Ist Unit Testing da praktikabel?
  • 9.5.8 Was ist, wenn wir eine Kombination aus Soft- und Hardware entwickeln?
  • 9.5.9 Wie können wir wissen, dass wir keine Bugs in unseren Tests haben?
  • 9.5.10 Mein Debugger zeigt mir, dass mein Code funktioniert: Wozu brauche ich Tests?
  • 9.5.11 Müssen wir Code im TDD-Stil schreiben?
  • 9.6 Zusammenfassung
  • Kapitel 10: Der Umgang mit Legacy-Code
  • 10.1 Wo soll man mit dem Einbauen der Tests beginnen?
  • 10.2 Bestimmen Sie eine Auswahlstrategie
  • 10.2.1 Vor- und Nachteile der Strategie »Einfaches zuerst«
  • 10.2.2 Vor- und Nachteile der Strategie »Schwieriges zuerst«
  • 10.3 Schreiben Sie Integrationstests, bevor Sie mit dem Refactoring beginnen
  • 10.4 Wichtige Tools für das Unit Testing von Legacy-Code
  • 10.4.1 Abhängigkeiten isolieren Sie leicht mit uneingeschränkten Isolation-Frameworks
  • 10.4.2 Verwenden Sie JMockit für Java-Legacy-Code
  • 10.4.3 Verwenden Sie Vise beim Refactoring Ihres Java-Codes
  • 10.4.4 Verwenden Sie Akzeptanztests, bevor Sie mit dem Refactoring beginnen
  • 10.4.5 Lesen Sie das Buch von Michael Feathers zu Legacy-Code
  • 10.4.6 Verwenden Sie NDepend, um Ihren Produktionscode zu untersuchen
  • 10.4.7 Verwenden Sie ReSharper für die Navigation und das Refactoring des Produktionscodes
  • 10.4.8 Spüren Sie Code-Duplikate (und Bugs) mit Simian und TeamCity auf
  • 10.5 Zusammenfassung
  • Kapitel 11: Design und Testbarkeit
  • 11.1 Warum sollte ich mir Gedanken um die Testbarkeit in meinem Design machen?
  • 11.2 Designziele für die Testbarkeit
  • 11.2.1 Deklarieren Sie Methoden standardmäßig als virtuell
  • 11.2.2 Benutzen Sie ein Interface-basiertes Design
  • 11.2.3 Deklarieren Sie Klassen standardmäßig als nicht versiegelt
  • 11.2.4 Vermeiden Sie es, konkrete Klassen innerhalb von Methoden mit Logik zu instanziieren
  • 11.2.5 Vermeiden Sie direkte Aufrufe von statischen Methoden
  • 11.2.6 Vermeiden Sie Konstruktoren und statische Konstruktoren, die Logik enthalten
  • 11.2.7 Trennen Sie die Singleton-Logik und Singleton-Halter
  • 11.3 Vor- und Nachteile des Designs zum Zwecke der Testbarkeit
  • 11.3.1 Arbeitsumfang
  • 11.3.2 Komplexität
  • 11.3.3 Das Preisgeben von sensiblem IP
  • 11.3.4 Manchmal geht's nicht
  • 11.4 Alternativen des Designs zum Zwecke der Testbarkeit
  • 11.4.1 Design-Argumente und Sprachen mit dynamischen Typen
  • 11.5 Beispiel eines schwer zu testenden Designs
  • 11.6 Zusammenfassung
  • 11.7 Zusätzliche Ressourcen
  • Anhang A: Tools und Frameworks
  • A.1 Isolation-Frameworks
  • A.1.1 Moq
  • A.1.2 Rhino Mocks
  • A.1.3 Typemock Isolator
  • A.1.4 JustMock
  • A.1.5 Microsoft Fakes (Moles)
  • A.1.6 NSubstitute
  • A.1.7 FakeItEasy
  • A.1.8 Foq
  • A.1.9 Isolator++
  • A.2 Test-Frameworks
  • A.2.1 Mighty Moose (auch bekannt als ContinuousTests) Continuous Runner
  • A.2.2 NCrunch Continuous Runner
  • A.2.3 Typemock Isolator Test Runner
  • A.2.4 CodeRush Test Runner
  • A.2.5 ReSharper Test Runner
  • A.2.6 TestDriven.NET Runner
  • A.2.7 NUnit GUI Runner
  • A.2.8 MSTest Runner
  • A.2.9 Pex
  • A.3 Test-APIs
  • A.3.1 MSTest-API - Microsofts Unit-Testing-Framework
  • A.3.2 MSTest für Metro Apps (Windows Store)
  • A.3.3 NUnit API
  • A.3.4 xUnit.net
  • A.3.5 Fluent Assertions Helper API
  • A.3.6 Shouldly Helper API
  • A.3.7 SharpTestsEx Helper API
  • A.3.8 AutoFixture Helper API
  • A.4 IoC-Container
  • A.4.1 Autofac
  • A.4.2 Ninject
  • A.4.3 Castle Windsor
  • A.4.4 Microsoft Unity
  • A.4.5 StructureMap
  • A.4.6 Microsoft Managed Extensibility Framework
  • A.5 Datenbanktests
  • A.5.1 Verwenden Sie Integrationstests für Ihre Datenschicht
  • A.5.2 Verwenden Sie TransactionScope für ein Rollback der Daten
  • A.6 Webtests
  • A.6.1 Ivonna
  • A.6.2 Team System Web Test
  • A.6.3 Watir
  • A.6.4 Selenium WebDriver
  • A.6.5 Coypu
  • A.6.6 Capybara
  • A.6.7 JavaScript-Tests
  • A.7 UI-Tests (Desktop)
  • A.8 Thread-bezogene Tests
  • A.8.1 Microsoft CHESS
  • A.8.2 Osherove.ThreadTester
  • A.9 Akzeptanztests
  • A.9.1 FitNesse
  • A.9.2 SpecFlow
  • A.9.3 Cucumber
  • A.9.4 TickSpec
  • A.10 API-Frameworks im BDD-Stil
  • Stichwortverzeichnis

Dateiformat: PDF
Kopierschutz: ohne DRM (Digital Rights Management)

Systemvoraussetzungen:

  • Computer (Windows; MacOS X; Linux): Verwenden Sie zum Lesen die kostenlose Software Adobe Reader, Adobe Digital Editions oder einen anderen PDF-Viewer Ihrer Wahl (siehe E-Book Hilfe).
  • Tablet/Smartphone (Android; iOS): Installieren Sie bereits vor dem Download die kostenlose App Adobe Digital Editions oder die App PocketBook (siehe E-Book Hilfe).
  • E-Book-Reader: Bookeen, Kobo, Pocketbook, Sony, Tolino u.v.a.m. (nur bedingt: Kindle)

Das Dateiformat PDF zeigt auf jeder Hardware eine Buchseite stets identisch an. Daher ist eine PDF auch für ein komplexes Layout geeignet, wie es bei Lehr- und Fachbüchern verwendet wird (Bilder, Tabellen, Spalten, Fußnoten). Bei kleinen Displays von E-Readern oder Smartphones sind PDF leider eher nervig, weil zu viel Scrollen notwendig ist.
Ein Kopierschutz bzw. Digital Rights Management wird bei diesem E-Book nicht eingesetzt. 

Weitere Informationen finden Sie in unserer  E-Book Hilfe.