{"id":55000288,"date":"2021-10-01T00:00:00","date_gmt":"2022-02-15T13:17:10","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=288"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Beispieldaten_generieren_mit_Bogus","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Beispieldaten_generieren_mit_Bogus\/","title":{"rendered":"Beispieldaten generieren mit Bogus"},"content":{"rendered":"<p><b>Wenn Sie eine Anwendung entwickeln, k&ouml;nnen Sie die meisten Funktionen nur testen, wenn die zugrunde liegende Datenbank bereits Beispieldaten enth&auml;lt. Ausnahmen sind beispielsweise Formulare zum Anlegen neuer Datens&auml;tze &#8211; hier legen Sie die Beispieldatenbank selbst an. In allen anderen F&auml;llen kann es nicht schaden, ein paar Beispieldatens&auml;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&uuml;r verschiedene Datenmodelle und Anwendungen Beispieldaten ben&ouml;tigen, reduzieren Sie den Aufwand zum Zusammenstellen der Beispieldaten zwar auf das einmalige Schreiben des Codes. Es macht aber auch keinen Spa&szlig;, sich dann Informationen wie Teststra&szlig;e, Beispielfirma und Co. aus den Fingern zu saugen. Um dies zu automatisieren und gegebenenfalls auch gr&ouml;&szlig;ere Mengen an Beispieldaten zu generieren, gibt es spezielle Tools. Eine davon hei&szlig;t Bogus &#8211; und diese stellen wir in diesem Artikel im Detail vor.<\/b><\/p>\n<p>F&uuml;r Menschen wie mich, die immer wieder frische Daten f&uuml;r die Beispiele f&uuml;r die Artikel und B&uuml;cher ben&ouml;tigen, ist ein Tool zum automatischen Generieren von Beispielcode nat&uuml;rlich Gold wert. Aber auch Sie k&ouml;nnen sich vermutlich eine Menge Arbeit sparen, wenn Sie die Tabellen Ihrer Anwendung vor dem Testen schnell mit passenden Beispieldaten f&uuml;llen k&ouml;nnen.<\/p>\n<p>Wie f&uuml;r die meisten Anwendungsf&auml;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&szlig;t Bogus und bietet bereits in der kostenlosen Variante sehr viele verschiedene m&ouml;gliche Generatoren f&uuml;r Daten unterschiedlichster Art an.<\/p>\n<p>Um zuvor einmal die grundlegende Idee zu skizzieren: Wir gehen davon aus, dass Sie in der zu programmierenden Anwendung beispielsweise eine Tabelle namens <b>Kunden <\/b>verwenden, dessen Eintr&auml;ge im Entity Data Model der Anwendung jeweils in einem Element namens <b>Kunde <\/b>gespeichert werden. Das Tool, in diesem Fall Bogus, soll uns eine M&ouml;glichkeit bieten, die Eigenschaften neu erstellter Elemente des Typs <b>Kunde <\/b>mit Werten zu f&uuml;llen.<\/p>\n<p>Wenn Kunde also beispielsweise Eigenschaften wie <b>Anrede<\/b>, <b>Vorname<\/b>, <b>Nachname<\/b>, <b>Strasse<\/b>, <b>PLZ <\/b>und <b>Ort <\/b>enth&auml;lt, dann m&uuml;sste das Tool Funktionen bereitstellen, mit denen Werte f&uuml;r genau diese Felder erzeugt werden k&ouml;nnen und die nach dem Zufallsprinzip ausreichend neue Werte liefern.<\/p>\n<p>Noch spannender wird es an der Stelle, wo wir verkn&uuml;pfte Tabellen haben &#8211; zum Beispiel <b>Kunden <\/b>und <b>Bestellungen<\/b>. Im einem Entity Data Model haben wir dann zwei Klassen namens <b>Kunde <\/b>und <b>Bestellung<\/b>, deren Eigenschaften wir nacheinander f&uuml;llen m&uuml;ssen. Allerdings m&uuml;ssen wir zuerst die Kunden erstellen und wenn wir in einer Bestellung den Kunden referenzieren, der diese Bestellung aufgegeben haben, m&uuml;ssen wir auf einen der zuvor erstellten Kunden verweisen. Auch diese M&ouml;glichkeit bietet das hier verwendete Tool <b>Bogus<\/b>.<\/p>\n<h2>Beispielanwendung<\/h2>\n<p>Um die Funktionen von Bogus schnell und komfortabel testen zu k&ouml;nnen, nutzen wir <b>LINQPad5<\/b>. Hier k&ouml;nnen wir Code schnell eingeben und ausf&uuml;hren, ohne immer direkt ein Projekt erstellen zu m&uuml;ssen. Wenn Sie <b>LINQ-Pad5 <\/b>ge&ouml;ffnet haben, sind zwei Schritte n&ouml;tig: der Wechsel zu einem passenden Query-Typ, hier <b>VB Program<\/b>, und das Hinzuf&uuml;gen von Bogus zur Query.<\/p>\n<h2>Bogus zur Query hinzuf&uuml;gen<\/h2>\n<p>Um das Bogus-Paket zur Query hinzuzuf&uuml;gen, klicken Sie mit der rechten Maustaste auf den Registerreiter f&uuml;r die Query. Dort w&auml;hlen Sie den Eintrag <b>Query Properties&#8230; <\/b>aus (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_05\/pic_288_002.png\" alt=\"Aufrufen der Query-Eigenschaften\" width=\"624,6265\" height=\"355,7874\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Aufrufen der Query-Eigenschaften<\/span><\/b><\/p>\n<p>Dies &ouml;ffnet den Dialog <b>Query Properties<\/b>. Hier klicken Sie unten auf die Schaltfl&auml;che <b>Add NuGet&#8230;<\/b>, was den Dialog <b>LINQPad NuGet Manager <\/b>&ouml;ffnet. Hier geben Sie im mittleren Bereich den Suchbegriff <b>Bogus <\/b>ein und klicken dann f&uuml;r den obersten Eintrag auf die Schaltfl&auml;che <b>Add to Query<\/b> (siehe Bild 2). Schlie&szlig;en Sie den Dialog, finden Sie den Eintrag <b>Bogus <\/b>nun im Dialog <b>Query Properties <\/b>im Bereich <b>Additional Reference <\/b>vor.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_05\/pic_288_001.png\" alt=\"Hinzuf&uuml;gen des Pakets Bogus\" width=\"700\" height=\"302,2577\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Hinzuf&uuml;gen des Pakets Bogus<\/span><\/b><\/p>\n<h2>Beispielkunde erstellen<\/h2>\n<p>Der Rahmen f&uuml;r die ersten Experimente mit Bogus ist eine einfache Kundenklasse. Diese definieren Sie wie folgt unterhalb der in der LINQPad-Query vorgegebenen Methode <b>Main<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> Kunde\r\n     Property Vorname<span style=\"color:blue;\"> As String<\/span>\r\n     Property Nachname<span style=\"color:blue;\"> As String<\/span>\r\n     Property Strasse<span style=\"color:blue;\"> As String<\/span>\r\n     Property PLZ<span style=\"color:blue;\"> As String<\/span>\r\n     Property Ort<span style=\"color:blue;\"> As String<\/span>\r\n     Property Land<span style=\"color:blue;\"> As String<\/span>\r\n     Property EMail<span style=\"color:blue;\"> As String<\/span>\r\n     Property Telefon<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>In der Methode <b>Main<\/b> werden wir gleich die Beispielmethoden aufrufen. Die erste hei&szlig;t <b>KundeAnlegen<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>Main\r\n     KundeAnlegen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Bogus nutzen<\/h2>\n<p>Die einfachste M&ouml;glichkeit, Bogus zu verwenden, ist das Initialisieren einer Objektvariablen auf Basis des Objekts <b>Bogus.Faker <\/b>und das anschlie&szlig;ende Erzeugen der verschiedenen Zufallsdaten.<\/p>\n<p>Das folgende Beispiel erledigt das und gibt so beispielsweise ein zuf&auml;llig ermitteltes Land aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AndereBeispiele\r\n     <span style=\"color:blue;\">Dim <\/span>objFaker<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Bogus.Faker()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> (objFaker.Address.Country)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auf Basis dieses Beispiels k&ouml;nnten Sie imgrunde schon die Eigenschaften von neu erzeugte Objekten f&uuml;llen. Es gibt jedoch noch praktischere Methoden. Mit der soeben vorgestellten Methode k&ouml;nnen Sie sich allerdings schon einmal durch die einzelnen Klassen und deren Eigenschaften arbeiten und sich die M&ouml;glichkeiten anschauen. Weiter unten finden Sie eine Beschreibung der einzelnen Klassen.<\/p>\n<h2>Objekte mit Bogus f&uuml;llen<\/h2>\n<p>Nun schauen wir uns in der Methode <b>KundeAnlegen <\/b>am Beispiel eines neuen Kunden an, wie Sie Bogus nutzen k&ouml;nnen. Dabei erstellen wir zuerst ein neues <b>Kunde<\/b>-Objekt und ein neues Objekt des Typs <b>Bogus.Faker <\/b>f&uuml;r unsere Klasse <b>Kunde<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>KundeAnlegen\r\n     <span style=\"color:blue;\">Dim <\/span>Beispielkunde<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Kunde\r\n     <span style=\"color:blue;\">Dim <\/span>objFaker<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Bogus.Faker(Of Kunde)<\/pre>\n<p>Das <b>Faker<\/b>-Objekt ist unser eigentlicher Generator. F&uuml;r diesen legen wir &uuml;ber die <b>RuleFor<\/b>-Eigenschaft fest, welche Eigenschaft des Zielobjekts mit welcher Eigenschaft des Fakers gef&uuml;llt wird. Die <b>RuleFor<\/b>-Definitionen legen wir einfach in einer langen Zeile jeweils durch einen Punkt getrennt hintereinander an &#8211; der &Uuml;bersichtlichkeit halber haben wir hier Zeilenumbr&uuml;che eingef&uuml;gt. Die erste Regel besagt beispielsweise, dass wir die Eigenschaft <b>Vorname <\/b>mit der Eigenschaft <b>Name.FirstName <\/b>des Fakers f&uuml;llen wollen, die weiteren Regeln legen die Quelle f&uuml;r die &uuml;brigen Eigenschaften fest:<\/p>\n<pre>     objFaker.RuleFor(Function(k) k.Vorname, Function(f) f.Name.FirstName) _\r\n         .RuleFor(Function(k) k.Nachname, Function(f) f.Name.LastName) _\r\n         .RuleFor(Function(k) k.Strasse, Function(f) f.Address.StreetAddress) _\r\n         .RuleFor(Function(k) k.PLZ, Function(f) f.Address.ZipCode) _\r\n         .RuleFor(Function(k) k.Ort, Function(f) f.Address.City) _\r\n         .RuleFor(Function(k) k.Land, Function(f) f.Address.Country) _\r\n         .RuleFor(Function(k) k.EMail, Function(f) f.Internet.Email) _\r\n         .RuleFor(Function(k) k.Telefon, Function(f) f.Phone.PhoneNumber) <\/pre>\n<p>Dabei nutzen wir nicht nur die <b>Name<\/b>-Klasse (f&uuml;r <b>FirstName <\/b>und <b>LastName<\/b>), sondern auch die <b>Address<\/b>-Klasse (f&uuml;r alle Adress-relevanten Daten) sowie die <b>Internet<\/b>-Klasse (f&uuml;r die E-Mail-Adresse aus der Eigenschaft <b>Email<\/b>) und die <b>Phone<\/b>-Klasse (f&uuml;r die Telefonnummer aus <b>PhoneNumber<\/b>). Danach folgt das eigentliche Erstellen. Hier rufen wir die <b>Generate<\/b>-Methode des <b>Faker<\/b>-Objekts auf und schreiben das Ergebnis vom Typ <b>Kunde <\/b>in die Variable <b>Beispielkunde<\/b>:<\/p>\n<pre>     Beispielkunde = objFaker.Generate<\/pre>\n<p>Die Werte der Eigenschaften des neuen <b>Kunde<\/b>-Objekts schreiben wir danach wie folgt in den Debug-Bereich:<\/p>\n<pre>     <span style=\"color:blue;\">Debug.Print<\/span>(\"Vorname: \" & Beispielkunde.Vorname)\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(\"Nachname: \" & Beispielkunde.Nachname)\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(\"Strasse: \" & Beispielkunde.Strasse)\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(\"PLZ: \" & Beispielkunde.PLZ)\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(\"Ort: \" & Beispielkunde.Ort)\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(\"Land: \" & Beispielkunde.Land)\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(\"E-Mail: \" & Beispielkunde.EMail)\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(\"Telefon: \" & Beispielkunde.Telefon\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000288\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000288?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000288\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"58f932c395\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie eine Anwendung entwickeln, k&ouml;nnen Sie die meisten Funktionen nur testen, wenn die zugrunde liegende Datenbank bereits Beispieldaten enth&auml;lt. Ausnahmen sind beispielsweise Formulare zum Anlegen neuer Datens&auml;tze &#8211; hier legen Sie die Beispieldatenbank selbst an. In allen anderen F&auml;llen kann es nicht schaden, ein paar Beispieldatens&auml;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&uuml;r verschiedene Datenmodelle und Anwendungen Beispieldaten ben&ouml;tigen, reduzieren Sie den Aufwand zum Zusammenstellen der Beispieldaten zwar auf das einmalige Schreiben des Codes. Es macht aber auch keinen Spa&szlig;, sich dann Informationen wie Teststra&szlig;e, Beispielfirma und Co. aus den Fingern zu saugen. Um dies zu automatisieren und gegebenenfalls auch gr&ouml;&szlig;ere Mengen an Beispieldaten zu generieren, gibt es spezielle Tools. Eine davon hei&szlig;t Bogus &#8211; und diese stellen wir in diesem Artikel im Detail vor.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662021,66052021,44000008,44000028],"tags":[],"yst_prominent_words":[],"class_list":["post-55000288","post","type-post","status-publish","format-standard","hentry","category-662021","category-66052021","category-Datenzugriffstechnik","category-Word_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000288","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000288"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000288\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000288"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}