www.dnug-koeln.de stefan lieser email: stefan@lieser-online.destefan@lieser-online.de web: :
Post on 06-Apr-2015
121 Views
Preview:
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