170 likes | 268 Views
TDD mit MSTest. Stefan Lieser Email: stefan@lieser-online.de Web: 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
E N D
TDD mit MSTest Stefan Lieser Email: stefan@lieser-online.de Web: 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 „classundertest“ ist von ihren Abhängigkeiten isoliert. • Integration Test • Tests über mehrere Layer • z.B. auch inkl. Datenbankzugriff
Überblick MSTest usingMicrosoft.VisualStudio.TestTools.UnitTesting; namespaceMeineTests { [TestClass] publicclassBasicTests { [TestMethod] publicvoid 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] publicclassBasicTests { private IList<string> list; [TestInitialize] publicvoid Setup() { list = new List<string>(); } [TestMethod] publicvoid 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 Analyse • Die Code Coverage Analyse dient dazu Quellcode zu finden der während der Tests nicht ausgeführt wird. • 100% Code Coverageheiß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 TestrunConfiguration legt fest welche Assemblies instrumentiert werden. • Test | Edit Test Run Configurations... | Code Coverage • Anschließend die Tests neu ausführen. • Im Fenster Code CoverageResults 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 (statebasedtests) • Verhaltensorientiert (interactionbasedtests)
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