Skip to content

buster/acmemusic

Repository files navigation

ACME Music Player - Architecture Playground

Line Coverage
Branch Coverage

Spielwiese für Architektur-Experimente

  • minimal lauffähiger Prototyp mit etwas Funktionalität

  • 3 Module

    • ein Microservice (TODO)

    • ein Modulith mit 2 Komponenten

Features

❓ ❌ ✅

  • 3 Module/Komponenten in einem Modulithen ✅

    • Users

      • Registrierung und Fake-Login (durch Registrierung implizit)

    • Musicplayer

      • MP3 hochladen

      • Lieder auflisten

      • MP3 abspielen

    • Scoreboard

      • Benutzer mit den meisten hochgeladenen Liedern bekommt eine "Auszeichnung"

  • Cucumber basierte Komponententests

  • Datenbankmigration mit Liquibase ✅

  • Java Modell Generierung mittels JOOQ ✅

    • kein JPA: JOOQ-basierte Datenbankzugriffe mittels JDBC ✅

  • maximal parallele, unabhängige Tests ✅

  • Event Driven ✅

  • Frontend mittels HTMX, Halfmoon CSS und Server Sent Events (SSE) ✅

Ideen

  • Spring Native getestet und verworfen (siehe [Erkenntnisse/ADRs] ) ✅

  • Modulith ✅

  • paralleles Testen ✅

  • Testdaten in größeren Prozessen ❓

  • Events ✅

  • Commands ❓

  • Dokumentation ❓

  • möglichst schnelles Onboarding ermöglichen ❓

  • Event und Prozessdokumentation ❓

    • In event Bibliothek test ob events alle in der Readme auftauchen

    • In der Readme draw io Bild mit event und Prozess?

  • Event Bibliothek ❓

    • Inbox und outbox pattern

    • Dokumentation von Event zu Service Zugehörigkeit?

Techstack

  • Java 21

  • JOOQ

  • Cucumber

  • Spring Boot

  • Postgres

  • Docker

  • Playwright

  • HTMX

  • Halfmoon CSS

Aufbau

Acme Aufbau

Ideen Scratchpad

Paralleles Testing ermöglichen ✅

  1. Daten nur explizit anlegen

    1. UUID am Szenarioanfang im Test

      1. A) spezifische Testdaten: ❌

        1. testdata-UUID()@testdata.local

        2. testdata-UUID().mp3

      2. B) "Tenant" ✅

        1. alle Usecase Commands um "Tenant" Parameter erweitern

          1. Default "1" oder "GLOBAL"

        2. Repos/Indizes nach Tenant-Id umbauen

    2. in AfterAll löschen aller Testdaten anhand des Tenants ✅

      1. Admin-Usecase zum Löschen?

Modulith ✅

  1. zweites Modul erstellen

  2. test2test kommunikation wie? Async App Listener? Fake Antworten/Events

  3. test2real == end to end test mit MessageBroker?

  4. Feature Test kann ja bestehen bleiben, je nach Modul andere Steps, aber Steps die für das Modul irrelevant sind → NOOP. Geht das?

  5. ArchUnit?

  6. Zugriff von einem Modul auf Model anderes Moduls verbieten?

  7. Usecase darf anderen Usecase in anderem Modul aufrufen, aber der Usecase gibt ein internes Domainobjekt zurück, ist das problematisch? In zwei Microservices gesplittet, wäre das Objekt ein DTO und hätte keine "Extra-Logik". Annahme: wenn aus dem Modulithen zwei Microservices werden, muss das beachtet werden. Vermutlich werden dann die Getter einfach im Controller aufgerufen und die "Extra-Logik" findet bei der Umwandlung zum DTO für die API automatisch statt.

Testdaten in komplexen Fachprozessen ❓

Wie können Tests geschrieben werden, welche sich am Ende eines komplexen fachlichen Prozesses befinden?

  1. Fachlich korrekte Testdatenbuilder schreiben

    1. Gefahr der Re-Implementierung der Businesslogik im Testcode → schlecht

    2. Wiederverwendung von Businesslogik möglich?

    3. Erzwingt Datenbankzugriff an Usecases vorbei im Testcode

      1. zwingende Wiederverwendung der Domain-Objekte

  2. Snapshot bzw. Backup/Restore Funktionalität für ein Szenario

    1. Szenario 1 laufen lassen

    2. Ergebnis von Szenario 1 snappshotten

    3. in Szenario 2 Snapshot wiederverwenden

    4. es entstehen Abhängigkeiten zwischen den Szenarien

  3. Testszenarien entlang der Prozesse schneiden und nicht einzelner Features

    1. Statt "MP3 abspielen", "User Einloggen" als einzelne Szenarien, ein Szenario für den Prozess des Musikabspielens "User registriert sich, user loggt sich ein, user lädt MP3 hoch, user spielt MP3 ab" in einem Szenario

    2. Gegebenenfalls natürlich in sinnvoll Szenarien schneiden, wenn es zu komplex wird

      1. "User spielt Lied direkt ab", "User spielt Lied in Playlist ab", "User teilt Playlist mit Freunden"

About

Spielwiese für Architekturideen

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published