Du hast meinen milden Spott nicht durchschaut: Wenn ich per Modul 10 Tests habe und 100 Module habe werden 1000 Tests durchgeführt. Falle ich durch einen Test durch, habe ich immer noch eine saugute Fehlerquote von 1 Promille die ich nach oben reporten kann.
Ach, wenn es nur um das reporten geht kann man sehr einfach an den Zahlen drehen.
These: Man kann zB. 100% Coverage durch die Tests haben, ohne eine einzige Assertion/Expectation
Ja, "test driven".. da will ich mich mal dran versuchen. Aber mein aktuelles Java-Hobby-Projekt ist 99% GUI da fehlt es im Moment noch an allem. Mache dazu gelegentlich mal ein Thema auf.
GUI & isol. Unittests ist so eine Sache, TDD is da sehr schwer, aber MVP/Passive View/Presenter First bieten eine einfacher zu testende Struktur, verglichen zB. mit "MVC".
Würde dir nicht empfehlen TDD an einem prod. Projekt oder GUI auszuprobieren, Spiel-Projekte (zB. nur die Domäne einer Zeiterfassung mit TDD zu erstellen, ohne GUI etc. pp.) eignen sich IMHO am besten um was ganz neues zu lernen.
Das größte Schwierigkeit an TDD IMHO: Den eigenen Schweinehund überwinden
Die Gewohnheit Dinge auf eine bestimmte Art anzugehen muss erstmal überwunden werden...
Das mag auch daran liegen, dass der bestehende Code auf andere Testverfahren ausgelegt ist. Es ist ja nicht so, dass automatisierte Unittests (im Sinne von zb. JUnit) die einzigen Verfahren sind. Lohn&Gehalt hab ich früher so getestet dass es einen entsprechenden Datenbestand gab und ein großes Tastaturmacro wärend der Mittagspause alle Abrechnungen über einen definierten Datenbestand ausgeführt hat. Danach die Ausdrucke prüfen (goto 1)
"Halbautomatische" Tests sind manchmal zwingend notwendig, je nachdem was getestet wird (zB. das Layout), aber wenn sich etwas automatisieren lässt ist das ja eine Gute Sache
Das verstehe ich jetzt nicht. Meinst Du Gesamtaufwand = 100%, 10%-15% für Unittests, Rest für Produktivsystem? 10-15% erscheint mir etwas wenig. Gib mal ein ungefähres Beispiel was da getestet wird.
So war das gemeint.. wenn auch ein bisschen überspitzt ausgedrückt
Isolierte Unittests sind bei TDD Whitebox tests, d.h. der Test kennt über den inneren Aufbau der zu testenden Klasse und prüft eben "ob der Code so funktioniert wie er sollte", also das verhalten, nicht nur das Ergebnis.
Mit "isoliert" ist gemeint dass man wirklich nur eine Klasse bzw. Methode prüft, alles andere (bis auf die Java API) wird gemockt, die Mocks prüfen dann ob bestimmte Methoden aufgerufen wurden.
Mocks Aren't Stubs
Dadurch dass man "sehr wenig" Code pro einzelnem Test prüft (kurze Klassen & Methoden!), bleiben die Tests recht einfach und man vermeidet vielleicht einfacher das redundante abdecken von Prod Code durch verschiedene Tests und hat eine bessere "defect localisation".
Selbst dafür sind 10-15% der Zeit wenig und als Ziel gedacht, Anfangs 30% zu brauchen oder mehr ist üblich, man muss sich ja erst die Frameworks zusammensuchen und ein paar utils etc. bauen.. wichtig ist eben dass die Tests wartbar bleiben, den Änderungen am Prod. Code sollten Tests brechen, diese müssen "einfach" zu reparieren sein.
Ständiges refactoring gehört natürlich auch dazu, werden aber nicht in die "10-15%" reingerechnet
Unittests prüfen natürlich nicht ob das Gesamtsystem funktioniert
Integrationstests wie zB. End to End Tests etc. sind immer noch wichtig.
Für Integrationstests zB. kann man DBUnit nutzen um Daten in die DB zu klopfen bzw. zu prüfen.