Beispieldaten generieren mit Bogus

Wenn Sie eine Anwendung entwickeln, können Sie die meisten Funktionen nur testen, wenn die zugrunde liegende Datenbank bereits Beispieldaten enthält. Ausnahmen sind beispielsweise Formulare zum Anlegen neuer Datensätze – hier legen Sie die Beispieldatenbank selbst an. In allen anderen Fällen kann es nicht schaden, ein paar Beispieldatensätze in den jeweiligen Tabellen bereitzustellen. Oft reicht es aus, das Anlegen einiger Elemente wie Kunden oder Produkte hart im Code zu verdrahten. Wenn Sie allerdings flexibel schnell für verschiedene Datenmodelle und Anwendungen Beispieldaten benötigen, reduzieren Sie den Aufwand zum Zusammenstellen der Beispieldaten zwar auf das einmalige Schreiben des Codes. Es macht aber auch keinen Spaß, sich dann Informationen wie Teststraße, Beispielfirma und Co. aus den Fingern zu saugen. Um dies zu automatisieren und gegebenenfalls auch größere Mengen an Beispieldaten zu generieren, gibt es spezielle Tools. Eine davon heißt Bogus – und diese stellen wir in diesem Artikel im Detail vor.

Für Menschen wie mich, die immer wieder frische Daten für die Beispiele für die Artikel und Bücher benötigen, ist ein Tool zum automatischen Generieren von Beispielcode natürlich Gold wert. Aber auch Sie können sich vermutlich eine Menge Arbeit sparen, wenn Sie die Tabellen Ihrer Anwendung vor dem Testen schnell mit passenden Beispieldaten füllen können.

Wie für die meisten Anwendungsfälle, die Sie mit Visual Studio abarbeiten, finden sich auch hier passende Erweiterungen im NuGet-Paket-Manager. Das Paket, das wir in diesem Artikel vorstellen wollen, heißt Bogus und bietet bereits in der kostenlosen Variante sehr viele verschiedene mögliche Generatoren für Daten unterschiedlichster Art an.

Um zuvor einmal die grundlegende Idee zu skizzieren: Wir gehen davon aus, dass Sie in der zu programmierenden Anwendung beispielsweise eine Tabelle namens Kunden verwenden, dessen Einträge im Entity Data Model der Anwendung jeweils in einem Element namens Kunde gespeichert werden. Das Tool, in diesem Fall Bogus, soll uns eine Möglichkeit bieten, die Eigenschaften neu erstellter Elemente des Typs Kunde mit Werten zu füllen.

Wenn Kunde also beispielsweise Eigenschaften wie Anrede, Vorname, Nachname, Strasse, PLZ und Ort enthält, dann müsste das Tool Funktionen bereitstellen, mit denen Werte für genau diese Felder erzeugt werden können und die nach dem Zufallsprinzip ausreichend neue Werte liefern.

Noch spannender wird es an der Stelle, wo wir verknüpfte Tabellen haben – zum Beispiel Kunden und Bestellungen. Im einem Entity Data Model haben wir dann zwei Klassen namens Kunde und Bestellung, deren Eigenschaften wir nacheinander füllen müssen. Allerdings müssen wir zuerst die Kunden erstellen und wenn wir in einer Bestellung den Kunden referenzieren, der diese Bestellung aufgegeben haben, müssen wir auf einen der zuvor erstellten Kunden verweisen. Auch diese Möglichkeit bietet das hier verwendete Tool Bogus.

Beispielanwendung

Um die Funktionen von Bogus schnell und komfortabel testen zu können, nutzen wir LINQPad5. Hier können wir Code schnell eingeben und ausführen, ohne immer direkt ein Projekt erstellen zu müssen. Wenn Sie LINQ-Pad5 geöffnet haben, sind zwei Schritte nötig: der Wechsel zu einem passenden Query-Typ, hier VB Program, und das Hinzufügen von Bogus zur Query.

Bogus zur Query hinzufügen

Um das Bogus-Paket zur Query hinzuzufügen, klicken Sie mit der rechten Maustaste auf den Registerreiter für die Query. Dort wählen Sie den Eintrag Query Properties… aus (siehe Bild 1).

Aufrufen der Query-Eigenschaften

Bild 1: Aufrufen der Query-Eigenschaften

Dies öffnet den Dialog Query Properties. Hier klicken Sie unten auf die Schaltfläche Add NuGet…, was den Dialog LINQPad NuGet Manager öffnet. Hier geben Sie im mittleren Bereich den Suchbegriff Bogus ein und klicken dann für den obersten Eintrag auf die Schaltfläche Add to Query (siehe Bild 2). Schließen Sie den Dialog, finden Sie den Eintrag Bogus nun im Dialog Query Properties im Bereich Additional Reference vor.

Hinzufügen des Pakets Bogus

Bild 2: Hinzufügen des Pakets Bogus

Beispielkunde erstellen

Der Rahmen für die ersten Experimente mit Bogus ist eine einfache Kundenklasse. Diese definieren Sie wie folgt unterhalb der in der LINQPad-Query vorgegebenen Methode Main:

Public Class Kunde
     Property Vorname As String
     Property Nachname As String
     Property Strasse As String
     Property PLZ As String
     Property Ort As String
     Property Land As String
     Property EMail As String
     Property Telefon As String
End Class

In der Methode Main werden wir gleich die Beispielmethoden aufrufen. Die erste heißt KundeAnlegen:

Sub Main
     KundeAnlegen
End Sub

Bogus nutzen

Die einfachste Möglichkeit, Bogus zu verwenden, ist das Initialisieren einer Objektvariablen auf Basis des Objekts Bogus.Faker und das anschließende Erzeugen der verschiedenen Zufallsdaten.

Das folgende Beispiel erledigt das und gibt so beispielsweise ein zufällig ermitteltes Land aus:

Public Sub AndereBeispiele
     Dim objFaker As New Bogus.Faker()
     Debug.Print (objFaker.Address.Country)
End Sub

Auf Basis dieses Beispiels könnten Sie imgrunde schon die Eigenschaften von neu erzeugte Objekten füllen. Es gibt jedoch noch praktischere Methoden. Mit der soeben vorgestellten Methode können Sie sich allerdings schon einmal durch die einzelnen Klassen und deren Eigenschaften arbeiten und sich die Möglichkeiten anschauen. Weiter unten finden Sie eine Beschreibung der einzelnen Klassen.

Objekte mit Bogus füllen

Nun schauen wir uns in der Methode KundeAnlegen am Beispiel eines neuen Kunden an, wie Sie Bogus nutzen können. Dabei erstellen wir zuerst ein neues Kunde-Objekt und ein neues Objekt des Typs Bogus.Faker für unsere Klasse Kunde:

Public Sub KundeAnlegen
     Dim Beispielkunde As New Kunde
     Dim objFaker As New Bogus.Faker(Of Kunde)

Das Faker-Objekt ist unser eigentlicher Generator. Für diesen legen wir über die RuleFor-Eigenschaft fest, welche Eigenschaft des Zielobjekts mit welcher Eigenschaft des Fakers gefüllt wird. Die RuleFor-Definitionen legen wir einfach in einer langen Zeile jeweils durch einen Punkt getrennt hintereinander an – der Übersichtlichkeit halber haben wir hier Zeilenumbrüche eingefügt. Die erste Regel besagt beispielsweise, dass wir die Eigenschaft Vorname mit der Eigenschaft Name.FirstName des Fakers füllen wollen, die weiteren Regeln legen die Quelle für die übrigen Eigenschaften fest:

     objFaker.RuleFor(Function(k) k.Vorname, Function(f) f.Name.FirstName) _
         .RuleFor(Function(k) k.Nachname, Function(f) f.Name.LastName) _
         .RuleFor(Function(k) k.Strasse, Function(f) f.Address.StreetAddress) _
         .RuleFor(Function(k) k.PLZ, Function(f) f.Address.ZipCode) _
         .RuleFor(Function(k) k.Ort, Function(f) f.Address.City) _
         .RuleFor(Function(k) k.Land, Function(f) f.Address.Country) _
         .RuleFor(Function(k) k.EMail, Function(f) f.Internet.Email) _
         .RuleFor(Function(k) k.Telefon, Function(f) f.Phone.PhoneNumber) 

Dabei nutzen wir nicht nur die Name-Klasse (für FirstName und LastName), sondern auch die Address-Klasse (für alle Adress-relevanten Daten) sowie die Internet-Klasse (für die E-Mail-Adresse aus der Eigenschaft Email) und die Phone-Klasse (für die Telefonnummer aus PhoneNumber). Danach folgt das eigentliche Erstellen. Hier rufen wir die Generate-Methode des Faker-Objekts auf und schreiben das Ergebnis vom Typ Kunde in die Variable Beispielkunde:

     Beispielkunde = objFaker.Generate

Die Werte der Eigenschaften des neuen Kunde-Objekts schreiben wir danach wie folgt in den Debug-Bereich:

     Debug.Print("Vorname: " & Beispielkunde.Vorname)
     Debug.Print("Nachname: " & Beispielkunde.Nachname)
     Debug.Print("Strasse: " & Beispielkunde.Strasse)
     Debug.Print("PLZ: " & Beispielkunde.PLZ)
     Debug.Print("Ort: " & Beispielkunde.Ort)
     Debug.Print("Land: " & Beispielkunde.Land)
     Debug.Print("E-Mail: " & Beispielkunde.EMail)
     Debug.Print("Telefon: " & Beispielkunde.Telefon
End Sub

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins DATENBANKENTWICKLER:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar