Mit Koroutinen können nebenläufige und asynchrone Anwendungen in Kotlin präzise und strukturiert geschrieben werden. Leider erhöht sich durch die Nebenläufigkeit oft auch die Komplexität und es ist schwierig, fehlerfreie und wartbare Programme zu erstellen. Als Lösung bietet sich die testgetriebene Entwicklung (TDD) an.
8. TDD-Mantra für Unit-Tests
Rot
Schreibe einen Test und lasse ihn laufen (er ist rot)
Grün
Schreibe einfachsten Code, um ihn grün zu machen
Refaktorisiere
Z. B. Pattern, Clean Code, Performance, etc.
8
9. Beispiel für einfachen Test
9
Arrange
Act
Assert
Starten
https://kotest.io/ https://plugins.jetbrains.com/plugin/14080-kotest
11. TDD ist also ganz einfach … ;-)
Dieses Beispiel ist einfach, denn …
● Rein funktional
● Keine Seiteneffekte, keine Exceptions, kein Zustand
Ist alles auf einfache Fälle reduzierbar?
11
Wichtig: Reine
Funktionen sind
einfach zu testen!
Art
#1
12. Und die Theorie …
12
https://labs.openai.com/s/WvacZqF8Ld7KSWRnHBg94hC8
13. Drei Arten des Testens
1. Ausgabe-basiert
2. Zustand-basiert
3. Kommunikations-basiert
13
“Shift up”
Funktional, “Immutable”, parallelisierbar
Vorsicht: Sichtbarkeit des Zustands, Thread-Safety
Kollaboration mit “Mocks” Drei
Arten
14. Ideal: Funktionale Architektur
1. Funktionaler Kern
Maximiere rein funktionalen Code (“immutable”)
Business-Logik, Domänen-Modell
Thread-Safe, einfach zu testen
2. “Mutable Shell”
Minimiere Seiteneffekte und Aktionen
14
22. Koroutinen sind Seiteneffekte
Koroutinen geben an
“wie” etwas berechnet wird, nicht “was”
Gegenteil der “deklarativen Programmierung”
Arrow benutzt unterbrechbare Funktionen als IO-Monade
Koroutinen in die “mutable Shell”!!!
22
https://en.wikipedia.org/wiki/Declarative_programming https://arrow-kt.io/docs/effects/io/
25. Testbarkeit herstellen
25
Eigene Funktion
Wie lange dauert der
Test? Unit-Tests sollten
schnell sein!
Wie soll man
Seiteneffekte testen?
Wichtig: TDD
erfordert modularen
Code, weil man
Abhängigkeiten
isolieren will
32. SWAPI - The Star Wars API
{
"name": "Luke Skywalker",
"height": "172",
"mass": "77",
…
"films": [
"https://swapi.dev/api/films/1/",
"https://swapi.dev/api/films/2/",
"https://swapi.dev/api/films/3/",
"https://swapi.dev/api/films/6/"
],
…
}
32
https://swapi.dev/api/people/1/
Ein Aufruf für Luke
und
weitere Aufrufe für die
Filme
Paradebeispiel für
Asynchronität
Sequentielle
Implementierung ist
langsam
45. I. Korrektheit
II. Terminierung, Deadlock-Freiheit, Thread-Safety
III. Operativer Teil
Wie bei sequentiellem Code
Asynchronität der Koroutinen?
Structured Concurrency, Channel, Flow
Was sollte bei Nebenläufigkeit getestet werden?
45
Performance-Test?
58. UIs haben einen Main-Thread
Der Main-Thread
● stellt UI-Elemente dar (“zeichnet Bildschirm”)
● wenn blockiert, friert Bildschirm ein
Daher: Netzwerk-Requests als Koroutinen!
58
https://developer.android.com/kotlin/coroutines/test
74. Referenzen
Kent Beck. Extreme Programming explained.
Kent Beck. Test-Driven Development by Example.
Vladimir Khorikov. Unit Testing Principles, Practices, and
Patterns. Anm. verwendet C#
74