Www.dnug-koeln.de Stefan Lieser Email: [email protected]@lieser-online.de Web: ://.

17
www.dnug-koeln.de www.justcommunity.de TDD mit MSTest Stefan Lieser Email: [email protected] Web: http://www.lieser-online.de

Transcript of Www.dnug-koeln.de Stefan Lieser Email: [email protected]@lieser-online.de Web: ://.

Page 1: Www.dnug-koeln.de  Stefan Lieser Email: stefan@lieser-online.destefan@lieser-online.de Web: ://.

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: ://.

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: ://.

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: ://.

Ü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: ://.

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: ://.

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: ://.

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: ://.

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: ://.

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: ://.

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: ://.

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: ://.

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: ://.

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: ://.

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: ://.

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: ://.

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: ://.

Links

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

Rhino.Mocks TypeMock JetBrains ReSharper NUnit