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“