Softwaretechnik

Lesson 2

TDD & Code Katas

Organisatorisches

  • Termine
  • Prüfungen
  • Übungen/Aufgaben

Termine

7.10. und 14.10. fallen aus

Prüfungen

  • Die Note entsteht zu 100% aus der Prüfung
  • Aufgaben werden nicht benotet
  • Prüfungsrelevant ist
    • Was auf den Folien steht
    • Was ich dazu erzählt habe
    • Was in Aufgaben gemacht wurde

Übungen/Aufgaben

  • Es wird Aufgaben geben
  • Oft in der Form
    • Recherche
    • Lesen von bestimmten Artikeln
    • Anschauen eines Video
  • Die Ergebnisse dieser Aufgaben sind Prüfungsrelevant

Meine Empfehlung

  • Bildet Gruppen
  • Schreibt zusammen was in der Vorlesung passiert ist
  • Macht es im Internet verfügbar
  • Zum Beispiel im Wiki des Github Repositories zur Vorlesung
  • Macht die Aufgaben, schriftlich
  • tauscht die Ergebnisse untereinander aus und bewertet sie


Feedback

Eine Rückkopplung, auch Rückkoppelung, Rückmeldung oder Feedback (engl.), ist ein Mechanismus in signalverstärkenden oder informationsverarbeitenden Systemen, bei dem ein Teil der Ausgangsgröße direkt oder in modifizierter Form auf den Eingang des Systems zurückgeführt wird.

Feedback

praktisches Beispiel

Selbst die einfachste Aufgabe wird extrem schwierig, wenn man kein angemessenes Feedback bekommt

Schneller ist besser

Feedback in der Programmierung

  1. Entwickeln
  2. Ausprobieren
  3. Wiederholen
Wie oft schaffen Sie das in einer halben Stunden?

Diplomarbeit in Simulationsphysik

  1. Programmieren (einige Stunden bis Tage)
  2. Initialzustand erzeugen (30min)
  3. Programm ausführen (5Tage)
  4. Datenan alysieren (1-2Stunden)
  5. Debuggen oder auf den Nobelpreis hoffen

Nicht so geschickt

Automatische Unit Tests

  • Testen kleinste Einheiten
    • Methoden
    • Klassen
    • KLEINE Cluster von Klassen
  • Kein I/O
    • I/O ist langsam
    • Keine Datenbank
    • Keine File Zugriff
    • Keine Netzwerkkommunikation
  • Schnell
    • 0.001s - 0.01s pro Test
    • 100-1000 Tests pro Sekunde
    • > 6000 Tests in der Minute

Struktur eines Test

  • Given
    • Vorbedingungen
  • When
    • Die eigentlich zu testende Aktion
  • Then
    • Die Prüfung; Die Bedingung die am Ende erfüllt sein muss

Der ideale Test

  • Hat genau einen Grund fehl zu schlagen
  • Macht offensichtlich was er testet
  • Muss nur angefasst werden, wenn das getestete Verhalten sich ändert.
  • Ist schnell
  • Ist unabhängig von anderen Tests
  • Gibt beim Fehlschlagen klare Informationen wo das Problem ist

Der reale Test

... ist oft ...
  • langsam
  • fällt aus allen möglichen Gründen auf die Nase
  • kann nur nach bestimmten anderen Tests ausgeführt werden
  • darf auf keinen Fall parallel zu anderen Tests laufen.
  • ist auch mal einfach so mal rot (und beim nächsten Lauf wieder grün)

Test First / TDD

  • Während der Entwicklung muss man schon mehrfach testen
  • Starten der Anwendung und ausprobieren kann sehr lang dauern
Erst den Test schreiben

TDD Zyklus

Red-Green-Refactor

Red

  • Einen Test schreiben
  • Ausführen
  • Sicherstellen, dass er rot ist
  • Sicherstellen, dass er aus dem richtigen Grund Rot ist
  • Sicherstellen, dass die Fehlermeldung hilfreich ist
  • Ein nicht kompilierender Test ist ein roter Test

Green

  • produktiven Code schreiben
  • so einfach wie möglich
  • so wenig wie möglich
  • nichts weil man es eh benötigt
  • alle Tests ausführen
  • Sind alle Grün?

Refactor

  • Code ändern ohne das Verhalten zu ändern
  • Nach jedem Schritt Tests ausführen
  • Nur bei Grünen Tests
  • Wenn die Implementierung zu einem Test ein Refactoring benötigt den Test erst noch einmal auskommentieren, um bei Green zu refactoren

Auswahl des nächsten Tests

  • Möglichst einfach zu implementieren
  • Aber so, dass er die Anwendung vorantreibt
  • Erst über das Design nachdenken

Effekte

  • Code wird zwangsläufig testbar
  • Es entsteht eine umfangreiche Regressionstestsuite
  • Fehler können schnell entdeckt werden
  • reduziert die potentiell verantwortlichen Codezeilen
  • Gut geschriebene Tests dienen als Spezifikation 

TDD ist kein Silver Bullet

  • Wirkt nur auf fein granulares Design
  • Ein ungeigneter Algorithmus wird nicht besser
  • Unit Tests sind nur eine von vielen notwendigen Testarten

Code Katas

Kata

Eine Form [(Kata)] in den Kampfkünsten ist eine genau festgelegte Abfolge von Bewegungen – wie Angriffen, Verteidigungen und Gegenangriffen - die einen Kampf gegen einen oder mehrere, reale oder imaginäre Gegner darstellt.

Code Kata

  • Eine einfache Aufgabe wird implementiert
  • TDD
  • ca 30min
  • Fertigstellung ist irrelevant, aber befriedigend
  • übt TDD
  • übt die effiziente Nutzung der IDE
  • Auch mit diversen Einschränkungen
    • Keine Maus
    • maximal 2 Attribute pro Klasse
    • Nur 2min pro TDD Zyklus

Die Bowling Kata


10 Frames mit maximal zwei Würfen um 10 Pins abzuräumen.

Die geworfenen Pins zählen als Punkte.

Werden alle 10 Pins mit dem zweiten Wurf abgeräumt (Spare), zählt der nächste Wurf als Bonus dazu.

Werden alle 10 Pins mit dem ersten Wurf eines Frames geworfen (Strike) zählen die nächsten beiden Würfe als Bonus.

Im 10 Frame gibt es für die Bonusbestimmung gegebenenfalls einen dritten Wurf.

API


score() wird nur am Ende des Spiels aufgerufen.

negative pins; pins > 10; frames >10 und dergleichen müssen nicht geprüft werden.

Go

Aufgabe 1

Recherche: Was macht (Java) Code schwer testbar? Was macht in einfach testbar?

Aufgabe 2

Dieses Video anschauen und verstehen
Bis Minute 42:00

Aufgabe 3

  • Installiert Git
  • Legt ein Repository (a) an
  • Legt eine Datei mit Inhalt in diesem Repository an (add + commit)
  • Cloned das Repository in das Repository (b)
  • Ändert die Datei in Repository (b) (add + commit)
  • pusht die Änderung zu Repository (a) 
  • prüft das die Änderungen in (a) angekommen sind.

Aufgabe 4

Recherche: Was tut in Git
  • rebase
  • merge
  • cherry-pick
?

Hilfreich

Code Retreat

  • Einen Tag lang Code Katas machen
  • Beliebige Programmiersprache
  • Ordentliches kostenloses Essen
  • Hervorragende Möglichkeit zu lernen

T-Systems onsite Services 
 14.12.2013 
 9:00 Uhr - 18:00 Uhr

softwaretechnik lesson2

By Jens Schauder

softwaretechnik lesson2

  • 1,650