www.dnug-koeln.de stefan lieser email: stefan@lieser-online.destefan@lieser-online.de web: :

Post on 06-Apr-2015

121 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

www.dnug-koeln.de www.justcommunity.de

TDD mit MSTest

Stefan Lieser

Email: stefan@lieser-online.deWeb: http://www.lieser-online.de

Agenda

Begriffsklärung Unit Test, Integration Test, etc.

Überblick MSTest Red, Green, Refactor

Vorgehensweise bei TDD Mock Frameworks

Rhino.Mocks TypeMock

Sollen Tests das Design beeinflussen?

Begriffsklärung

Unit Test Automatisiert durch Anwendung eines

Test Frameworks (MSTest, Nunit, MbUnit, etc.).

Testet die kleinste Einheit, in der Regel eine Klasse.

Die „class under test“ ist von ihren Abhängigkeiten isoliert.

Integration Test Tests über mehrere Layer z.B. auch inkl. Datenbankzugriff

Überblick MSTest

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace MeineTests{ [TestClass] public class BasicTests { [TestMethod] public void Test() { int i = 5; Assert.AreEqual(5, i); } }}

Klasse enthält Tests

Diese Methode ist ein Test

Annahme die erfüllt sein muss

Test Setup

[TestClass]public class BasicTests{ private IList<string> list;

[TestInitialize] public void Setup() { list = new List<string>(); }

[TestMethod] public void Test() { list.Add("bla"); Assert.AreEqual(1, list.Count); }}

Initialisierung die vor jeder Testmethode ausgeführt wird.

MSTest Projekt - Tücke

Damit MSTest ein Projekt als Testprojekt erkennt muss in der Projektdatei folgender Eintrag vorhanden sein:

<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB}; {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

Solange man Testprojekte über das vorhandene Projekt-Template anlegt ist dies gegeben...

Code Coverage AnalyseDie Code Coverage Analyse dient dazu Quellcode zu finden der während der Tests nicht ausgeführt wird.100% Code Coverage heißt nicht 100% Test Coverage!!!Beispiel: 100% Code Coverage wird bereits bei einem beliebigen i mit 0 < i < 10 erreicht. 100% Test Coverage erst bei allen i mit 0 < i < 10.if ((i > 0) && (i < 10)) { Berechne(i);}

Code Coverage Analyse - Howto

Die Testrun Configuration legt fest welche Assemblies instrumentiert werden.Test | Edit Test Run Configurations... | Code Coverage

Anschließend die Tests neu ausführen.Im Fenster Code Coverage Results kann die Einfärbung des Quellcodes aktiviert werden.

Red, Green, Refactor

Red Schreibe einen Test. Implementiere gerade soviel dass es

syntaktisch korrekt ist. Test schlägt fehl.

Green Ergänze die Implementierung gerade so

weit, dass der Test erfolgreich ist. Refactor

Überarbeite die Implementierung so dass sie „besser“ wird, ohne ihr Verhalten zu modifizieren.

Test first?

Sapir-Whorf Hypothese Die Sprache formt das Denken.

Spezifikation (statt Test) trifft die Sache eher.

Test first führt dazu dass man eine neue Funktionalität erst anwendet ehe man sie implementiert. Dadurch wird die API in der Regel besser.

Test first?

Die Testabdeckung (Coverage) ist in der Regel höher als bei Tests die im Nachhinein ergänzt werden.

Kein Dogma! Manchmal geht es nur im Nachhinein.

Manchmal hilfreich: erst einen Spike ohne Tests, diesen dann wegwerfen und Test first neu

beginnen.

Isolieren einer Klasse

Unit Tests testen eine Klasse isoliert, also ohne ihre Abhängigkeiten.

Die Abhängigkeiten werden durch Test Doubles ersetzt.

Implementieren der Test Doubles durch handgeschriebene Klassen, von einem Mock Framework generierte

Klassen. Stub

Reines Double Mock

Stub mit zu prüfenden Erwartungen

Testverfahren

Zustandsorientiert (state based tests)Verhaltensorientiert (interaction based tests)

Test Doubles

Stub Ein Double welches die Abhängigkeit der

zu testenden Klasse ausfüllt. Rückgabewerte und Verhalten können

von außen gesteuert werden um das Verhalten der zu testenden Klasse zu beeinflussen.

Mock Es werden Erwartungen definiert die

durch den Test erfüllt werden müssen. Wird eine Erwartung nicht erfüllt schlägt

der Test fehl.

Mock Framework - Arbeitsweise• Record/Replay• Während der Record Phase wird definiert

wie sich das Objekt später verhalten soll.• In der Replay Phase wird das zuvor

aufgezeichnete Verhalten abgespielt.• Bei Mock Objects zusätzlich:• Nach der Replay Phase wird geprüft, ob

alle erwarteten Aufrufe korrekt erfolgt sind.

Mock Frameworks - Beispiele

Rhino.Mocks (open source) Implementiert mit Hilfe von zur Laufzeit

generierten Proxy Klassen. Verwendet Castle Proxy

TypeMock (commercial, abgespeckt free) Verwendet das Profiler API um Aufrufe

abzufangen. Technisch leistungsfähiger (z.B.

Unterstützung für statische Methoden).

Links

Sapir-Whorf These: http://de.wikipedia.org/wiki/Sapir-Whorf-Hypothese

Rhino.Mocks TypeMock JetBrains ReSharper NUnit

top related