Dies ist eine alte Version des Dokuments!


  • Unit testing
  • Was ist ein Unit?
    • Einheit: Übereinkunft im Team
    • Unit Testing deutsch: Modultest, Komponententest → keine Aussage über die Größe eines Units
    • Wikipeda unit testing: A unit is the smallest testable part of an application
    • Nützlich?
  • Abgrenzungen
    • Akzeptanztests - Erfüllt das Programm die Anforderungen
    • Funktionale Anforderungen
    • Nichtfunktionale Anforderungen
      • ⇒ Concordion
    • Integrationstest - Zusammenspiel von Komponenten
    • Teile des Systems
    • Ganzes System
    • Unit Test
    • Testbare Teile in isolation
    • Typisch in OO: Klassentest
    • Auch Integrationstests und Akzeptanztests können mit xUnit geschrieben sein!
  • Was finden wir oft in existierender Software vor?
    • Ein paar mit xUnit geschriebene Tests
    • Tests prüfen eine Hand voll Probleme, oftmals mehrere Komponenten im Zusammenspiel.
    • Manchmal unter Einbeziehung der Umwelt
    • –> Das sind keine Unit-Tests
  • Was leistet eigentlich Unit-Testing?
    • Einfaches Beispiel: Code Kata Anagramm: ![www.codingdojo.org—wiki.plhttp:www.codingdojo.org/cgi-bin/wiki.pl?KataBankOCR]() * Wir machen das als TDD (Checksum) * Regeln für einen Unit-Test live erarbeiten (Protokoll) * What is the object under Test? * Naming (Assumption On Condition) * Keine Reihenfolge * Common Setup - nur um die Lesbarkeit zu erhöhen * Mocking (Don't use 3rd party) * Mocks / Stubs ![martinfowler.com—mocksArentStubs.htmlhttp:martinfowler.com/articles/mocksArentStubs.html]()
  • –> Hauptgrund für IoC, Programming against Interfaces, etc. …
  • ![mockito.googlecode.com—Mockito.htmlhttp:mockito.googlecode.com/svn/branches/1.5/javadoc/org/mockito/Mockito.html]() * State vs. Behaviour * lawnsprinkler.enable() * expect valve.open() * verify(grass.isWet()) * Beobachtungen: * Programm und Test ist fertig, können wir Bugs finden? * Was soll das ganze dann? * Aufgaben von Unit-Tests * Test von Entwicklerannahmen * Die Tests stellen sicher, dass die Klassen das Interface erfüllen, das wir als Entwickler festegelegt haben. * Umfangeiche Interfaces machen mehr Mühe beim Testen: Interfaces werden kleiner * Hauptnutzen: Ich kann die Implementaton ändern und merke ob die neue Implementation noch das alte Interface erfüllt (Regression) * Aber: Unit-Tests sind kein Ersatz für weiteres Testing (siehe Abgrenzung) * Aber: Unit-Tests finden keine neuen Bugs * Nach der Entwicklung ist der Test OK * Non-Functional: * Tests müssen ohne Aufwand durchzuführen sein * Test müssen schnell sein * Ergebnis: Höheres Vertrauen des Entwicklers in den Code * Ergebnis: Verhindert „ich traue mich nicht das zu ändern“