Testdriven Development TDD
TDD (dt. testgetriebene Entwicklung)
versucht jede Softwarekomponente durch automatisiert ausgeführte Komponententests (Unit-Tests) zu testen. Zweck ist hierbei, unbemerkt auftretende Seiteneffekte bei Änderungen (Refactoring) oder Erweiterungen zu vermeiden. Das erhöht die Qualität der Software und die Produktivität des Entwicklers.
Bei testgetriebener Entwicklung wird versucht, zuerst den Test zu schreiben und dann die entsprechende Funktionalität zu implementieren. Das bewirkt, dass man sich zuerst über das erwartete Verhalten der Methode Klarheit verschafft und im Sinne möglichst vollständiger Testabdeckung kein Test „vergessen“ wird.

Abb. 1: Testgetriebene Entwicklung
Demoprogramm
- /* zu testende Klasse
- * */
- using System;
- namespace testDemoTDD
- {
- public class Bruch
- {
- private double zaehler;
- private double nenner;
- public Bruch(double z, double n)
- {
- zaehler = z;
- nenner = n;
- }
- public double quotient()
- {
- if (nenner == 0)
- throw new DivideByZeroException();
- return zaehler / nenner;
- }
- }
- }
Listung 1: Datei Bruch.css mit der zu testenden Klasse
- /* Testklasse (jede zu testende Klasse erhält eine eigene Testklasse)
- * */
- using System;
- using Microsoft.VisualStudio.TestTools.UnitTesting;
- namespace testDemoTDD
- {
- [TestClass]
- public class testBruch
- {
- [TestMethod]
- public void testQuotient1()
- {
- Bruch b1 = new Bruch(1,2);
- Assert.AreEqual(0.5, b1.quotient());
- }
- [TestMethod]
- [ExpectedException(typeof(DivideByZeroException))]
- public void testQuotient2()
- {
- Bruch b1 = new Bruch(1, 0);
- b1.quotient();
- }
- }
- }
Listung 2: Die dazugehörige Testklasse in der Datei BruchTest.cs

Abb. 2: Oberfläche des Testprogramms
Oberfläche und Logikschicht müssen sauber getrennt werden, damit die Unittest die Logik vollständig abdecken können:

Abb. 3: Trennung von Logikschicht und UI