![Page 1: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/1.jpg)
www.dnug-koeln.de www.justcommunity.de
TDD mit MSTest
Stefan Lieser
Email: [email protected]: http://www.lieser-online.de
![Page 2: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/2.jpg)
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?
![Page 3: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/3.jpg)
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
![Page 4: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/4.jpg)
Ü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
![Page 5: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/5.jpg)
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.
![Page 6: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/6.jpg)
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...
![Page 7: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/7.jpg)
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);}
![Page 8: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/8.jpg)
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.
![Page 9: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/9.jpg)
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.
![Page 10: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/10.jpg)
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.
![Page 11: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/11.jpg)
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.
![Page 12: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/12.jpg)
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
![Page 13: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/13.jpg)
Testverfahren
Zustandsorientiert (state based tests)Verhaltensorientiert (interaction based tests)
![Page 14: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/14.jpg)
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.
![Page 15: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/15.jpg)
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.
![Page 16: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/16.jpg)
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).
![Page 17: Www.dnug-koeln.de Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: :](https://reader036.vdocuments.us/reader036/viewer/2022062404/55204d8149795902118d47d1/html5/thumbnails/17.jpg)
Links
Sapir-Whorf These: http://de.wikipedia.org/wiki/Sapir-Whorf-Hypothese
Rhino.Mocks TypeMock JetBrains ReSharper NUnit