5 Stimmen

DSL zur Erzeugung von Testdaten

Es gibt verschiedene Möglichkeiten, Daten für Tests (nicht nur Unit-Tests) zu generieren, z.B. Object Mother, Builder, etc. Ein weiterer nützlicher Ansatz besteht darin, Testdaten als reinen Text zu schreiben:

product: Main; prices: 145, 255; Expire: 10-Apr-2011; qty: 2; includes: Sub
product: Sub; prices: 145, 255; Expire: 10-Apr-2011; qty: 2

und dann in C#-Objekte zerlegen. Dies ist einfach in Unit-Tests zu verwenden (weil tiefe innere Sammlungen in einer einzigen Zeile geschrieben werden können), dies ist noch bequemer, in FitNesse-ähnlichen System zu verwenden (weil diese DSL natürlich in Wiki passt), und so weiter.

Also benutze ich diese und schreiben Parser, aber es ist mühsam, jedes Mal zu schreiben. Ich bin kein großer Experte für DSL/Sprachparser, aber ich denke, sie können hier helfen. Welcher wäre der richtige für mich? Ich habe nur von gehört:

  • DSL (ich meine, tout DSL)
  • Boo (der meiner Meinung nach DSL machen kann)
  • ANTLR

aber ich weiß nicht einmal, welches ich auswählen und wo ich anfangen soll.

Die Frage ist also: Ist es sinnvoll, eine Art DSL zu verwenden, um Testdaten zu erzeugen? Was würden Sie vorschlagen, um dies zu tun? Gibt es bereits Beispiele?

Update: scheint, wie ich war nicht klar genug. Es geht nicht um die Konvertierung von raw string in object. Schauen Sie sich die erste Zeile an und beziehen Sie sie auf

var main = Product.New("Main")
   .AddPrice(Price.New(145).WithType(PriceType.Main).AndQty(2))
   .AddPrice(Price.New(255).WithType(PriceType.Maintenance).AndQty(2))
   .Expiration(new DateTime(10, 04, 2011));
var sub =  Product
   .New("Sub").Parent(main)
   .AddPrice(...));
main.AddSubProduct(sub);
products.Add(main);
products.Add(sub);

Und beachten Sie, dass ich zuerst ein Unterprodukt erstelle und es dann dem Hauptprodukt hinzufüge, auch wenn es in umgekehrter Reihenfolge aufgelistet ist. Die Preise werden auf besondere Weise behandelt. Ich möchte den Namen des Unterprodukts angeben und einen Verweis auf dieses Produkt erhalten - erstellt. Ich möchte alle Produkteigenschaften - FLAT und NON-REPEATATIVE - in einer einzigen Zeile auflisten. Ich möchte Standardwerte für Eigenschaften verwenden. Und so weiter.

Update: Ich bin nicht davon überzeugt, DSL zu vermeiden, weil alle alternativen Beispiele zu langatmig und nicht benutzerfreundlich sind. Und niemand hat etwas Nützliches über DSL gesagt.

2voto

nkrkv Punkte 6944

Für die Daten DSL YAML ist ein ausgezeichneter Kandidat. Hier ist ein Beispiel aus Wikipedia:

---
receipt:     Oz-Ware Purchase Invoice
date:        2007-08-06
customer:
    given:   Dorothy
    family:  Gale

items:
    - part_no:   A4786
      descrip:   Water Bucket (Filled)
      price:     1.47
      quantity:  4

    - part_no:   E1628
      descrip:   High Heeled "Ruby" Slippers
      price:     100.27
      quantity:  1

bill-to:  &id001
    street: |
            123 Tornado Alley
            Suite 16
    city:   East Westville
    state:  KS

ship-to:  *id001

specialDelivery:  >
    Follow the Yellow Brick
    Road to the Emerald City.
    Pay no attention to the
    man behind the curtain.

Ich habe YAML in mehreren Projekten eingesetzt und bin sehr zufrieden damit.

Wenn wir jedoch über Folgendes sprechen Einheit -Tests ist es in der Regel einfacher und lesbarer, die notwendigen Objekte "von Hand" mit Konstruktoren und Eigenschaftszuweisungen an Ort und Stelle zu konstruieren. Das liegt daran, dass Unit-Tests von Natur aus stark auf einen bestimmten Code (Unit) fokussiert sind, und es sollte nicht schwer sein, eine Dateninfrastruktur zu erstellen, die nur genug für den Test. Es ist in Ordnung, in Unit-Tests mit halbfertigen Entitäten zu arbeiten, machen Sie sich nicht die Mühe, Daten zu konstruieren, die nicht mit diesem konkreten Test zusammenhängen.

Für funktionale Tests ist YAML hervorragend geeignet.

1voto

Marcelo Cantos Punkte 173498

Ich würde zunächst prüfen, ob die von mir gewählte Sprache ausreicht, um meine DSL zu erstellen. C# sollte Ihren Fall recht einfach behandeln:

Product[] products = new Product[] {
    new TestProduct{product="Main", prices=new[]{145, 255}, Expire="10-Apr-2011", qty=2, includes="Sub"},
    new TestProduct{product="Sub", prices=new[]{145, 255}, Expire="10-Apr-2011", qty=2}
};

Nicht ganz so schön, aber auf jeden Fall erträglich genug, dass ich den zusätzlichen Aufwand für ein individuelles DSL nicht rechtfertigen würde.

Beachten Sie auch, dass Expire mit einer Zeichenkette initialisiert wird, es sich aber offensichtlich um ein Datum handelt. Dies ist für ein DSL-Idiom vollkommen angemessen, da TestProduct.Expire Die Übersetzung kann der Einrichter übernehmen.

0voto

Gabriel Ščerbák Punkte 17544

Für die Erstellung einer externen DSL würde ich Eclipse TMF Xtext empfehlen, das wirklich gut ist (basiert auf ANTLR, ist aber einfacher), aber auf Eclipse und Java aufbaut, wobei Sie jeden beliebigen Code generieren können. Wenn es um die Erstellung von Testdaten geht, habe ich mich von der Art und Weise inspirieren lassen, wie es die Jungs von Ruby on Rails machen, nämlich mit YAML-Fixtures, wie in einer anderen Antwort erwähnt, aber ich habe auch einen Ansatz gesehen, bei dem Factories verwendet werden, die Ihnen helfen können, einige Duplizität und Inflexibilität loszuwerden. Sehen Sie sich das an Eisenbahnsendungen 158: Fabriken statt Fixturen Vielleicht erhalten Sie dadurch einige Anregungen für die Gestaltung der DSL.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X