Dienstag, 29. März 2011

Die Beispieldomäne Forum

Um die Anforderungen an eine DSL für die Beschreibung von Akzeptanztests besser erfassen zu können, ist eine Beispieldomäne notwendig. Sebastian Teichgräber hat dazu eine Domäne aus der Beherbergungsbranche verwendet. Ich verwende als Beispieldomäne ein Online-Forum. Foren sind den meisten Internetbenutzern bekannt. Somit sind Anwendungsfälle in dieser Domäne leicht nachvollziehbar. Ein weiterer Vorteil ist, dass funktionierende und kostenlos verfügbare Forensoftware mit einigermaßen komplexen Datenbankstrukturen bereits existiert. Diese kann man verwenden, um die entwickelte DSL zu testen.

Online-Forum SMF


Ich verwende die Software Simple Machines Forum (kurz SMF) in Version 2.0 RC5. Bei der Installation wurde smf_ als Präfix für Tabellennamen angegeben. Somit heben sich die Tabellennamen besser von den Namen der Domänenobjekten ab, die manuell definiert werden. Die Software erzeugt bei der Erstellung 63 Tabellen. Somit macht es auch Sinn, von der Datenbankstruktur hin zum fachlichen Domänenmodell zu abstrahieren.

Anwendungsfälle in einem Online-Forum


Ein Online-Forum hat u.A. die folgenden Anwendungsfälle:



Der Anwendungsfall "Thema starten" sieht im Detail folgendermaßen aus:

Name Thema starten
Beschreibung Der Benutzer startet ein neues Thema.
Auslöser Der Benutzer möchte ein neues Thema starten.
Vorbedingungen
  • Der Benutzer ist angemeldet.
  • Das Unterforum, in dem das Thema erstellt werden soll, existiert.
  • Das zu erstellende Thema existiert in dem Unterforum noch nicht, in dem es erstellt werden soll.
Nachbedingung
  • Das zu erstellende Thema existiert im passenden Unterforum.
  • Das zu erstellende Thema hat einen Beitrag.
Standardablauf
  1. Der Benutzer wählt das Unterforum, in dem er ein Thema erstellen möchte.
  2. Der Benutzer wählt "Neues Thema".
  3. Der Benutzer gibt den Titel und den Text des Themas ein.
  4. Der Benutzer klickt auf senden.

Groovy-DSL für die Vor- und Nachbedingungen


Eine DSL für die Formulierung von Vor- und Nachbedingungen sollte so gestaltet sein, dass sie der natürlichen Sprache, die im letzten Abschnitt zur Formulierung verwendet wurde, möglichst ähnlich ist. Die Vor- und Nachbedingungen aus dem letzten Abschnitt können folgendermaßen als gültiger Groovy-Code dargestellt werden:

//Vorbedingungen
prüfe {
    Testbenutzer.istAngemeldet
    Testforum.existiert
    NeuesThema.existiertNicht
}

//Nachbedingungen
prüfe {
    NeuesThema.existiert
    Testforum.Themen.enthält NeuesThema
    NeuesThema.Beiträge.anzahl = 1
    NeuesThema.Beiträge.enthält NeuerBeitrag
}

Definition von Testdaten


Die Begriffe existiert, existiertNicht, anzahl und enthält sind eingebaute Bestandteile der DSL, da sie für die meisten Vor- und Nachbedingungen gebraucht werden. Die Begriffe Testbenutzer, Testforum, NeuesThema, NeuerBeitrag und istAngemeldet müssen vom Benutzer definiert werden, da sie domänenspezifisch sind. Die Definitionen sehen folgendermaßen aus:

definiere Testbenutzer {
    istEin Benutzer
    mit {
        Nickname = "Testbenutzer"
    }
}

definiere Testforum {
    istEin Forum
    mit {
        Name = "Testforum"
    }
}

definiere NeuesThema {
    istEin Thema
    mit {
        Titel = "Testthema"
    }
}

definiere NeuerBeitrag {
    istEin Beitrag
    mit {
        Titel = "Testthema"
        Text = "Testtext"
    }
}

Das Schlüsselwort definiere erzeugt ein neues Domänenobjekt in der Domäne. Mit istEin legt man fest auf welchen Domänenobjekt das zu erstellende basieren soll. Dabei werden alle Eigenschaften des Basisobjektes vererbt und sind im neuen verfügbar. Mit dem Schlüsselwort mit kann man Constraints für das neue Domainobjekt festlegen. Im Beispiel NeuerBeitrag wird z.B. festgelegt, dass der Titel "Testthema" und der Text "Testtext" sein muss.

Definition von Domänenobjekten


Was Benutzer, Forum, Thema und Beitrag sind muss ebenfalls definiert werden. Das ist je nach verwendeter Foren-Software anders. Bei dem verwendeten SMF-Forum kann man einen Beitrag beispielsweise folgendermaßen definieren:

definiere Beitrag {
    istEin smf_messages
    definiereEigenschaft Titel {
        istEigenschaft smf_messages.subject
    }
    definiereEigenschaft Text {
        istEigenschaft smf_messages.body
    }
}

Mit dem Schlüsselwort definiereEigenschaft legt man neue Eigenschaften für das Domänenobjekt fest. Diese können später z.B. in Constraints verwendet werden. In den meisten Fällen basiert die neue Eigenschaft auf vererbten Eigenschaft des Basisobjektes. Das wird durch das Schlüsselwort istEigenschaft festgelegt.

smf_messages ist eine Datenbanktabelle. subject und body sind Spalten dieser Tabelle. In der zu erstellenden Software ist smf_messages ebenfalls ein Domänenobjekt. Dieses Objekt wird von Software automatisch erstellt. Die Software erstellt für jede Tabelle mit all ihren Spalten jeweils genau ein Domänenobjekt. Diese Domänenobjekte bilden die Basis für alle benutzerdefinierten Domänenobjekte. Dadurch wird es möglich SQL-Queries zu generieren und die Vor- und Nachbedingungen überprüfen zu lassen.

Keine Kommentare:

Kommentar veröffentlichen