2016-01-23 12 views
6

Ich liebe Faker, ich benutze es in meinem seeds.rb die ganze Zeit, um meine dev-Umgebung mit real-aussehenden Daten zu füllen.Sollten wir Faker in Rails Fabriken verwenden?

Ich habe auch gerade angefangen zu verwenden Factory Girl, die auch eine Menge Zeit spart - aber wenn ich für Code Beispiele im Internet sleuth sehe ich nicht viel Beweise von Menschen die Kombination der beiden.

Frage: Gibt es einen guten Grund, warum Menschen in einer Fabrik keinen Fälscher benutzen?

Mein Gefühl ist, dass ich dadurch die Robustheit meiner Tests erhöhen würde, indem ich jedes Mal zufällige - aber vorhersehbare - Daten säte, die hoffentlich die Wahrscheinlichkeit erhöhen würden, dass ein Fehler auftaucht.

Aber vielleicht ist das falsch und es gibt keinen Vorteil gegenüber der harten Codierung einer Fabrik oder ich sehe keine potenzielle Fallstricke. Gibt es einen guten Grund, warum diese beiden Edelsteine ​​kombiniert werden sollten oder nicht?

+0

Warum möchten Sie bei jedem Erstellen eines Testmodells Daten dynamisch generieren? Es ist nur Overhead –

+0

Richtig so vereinbart, Testleistung wäre betroffen - aber konnte nicht, dass es sich lohnt, eine komplexe App, vor allem eine mit vielen Validierung, um zu überprüfen, dass ich nicht etwas Dummes geschrieben habe, die 'firstName: Michal erlaubt 'aber nicht' firstName: Huw', sicherlich würde die Vielfalt von Faker zu robusteren Tests führen? – Huw

+0

Es heißt Rand-Case-Test. Immer noch keine Notwendigkeit für zufällige Daten –

Antwort

5

Einige Leute dagegen argumentieren, wie here.

NICHT RANDOM -Attribut WERTE

Ein gemeinsames Muster eine gefälschte Datenbibliothek zu verwenden ist (wie Faker oder Forgery) Zufallswerte auf die Fliege zu erzeugen. Dies mag für Namen, E-Mail-Adressen oder Telefonnummern attraktiv erscheinen, aber es dient keinem wirklichen Zweck. Erstellen von einzigartigen Werten ist einfach genug, um mit Sequenzen:

FactoryGirl.define do 
    sequence(:title) { |n| "Example title #{n}" } 

    factory :post do 
    title 
    end 
end 

FactoryGirl.create(:post).title # => 'Example title 1' 

Ihre randomisierten Daten an einigen Abzug zu unerwarteten Ergebnissen in Ihren Tests könnten, Ihre Fabriken frustrierend machen, mit zu arbeiten.Jeder Wert, der beeinflussen könnte Ihr Testergebnis in irgendeiner Weise müssten außer Kraft gesetzt werden, Bedeutung:

Im Laufe der Zeit werden Sie neue Attribute entdecken, die Ihren Test verursachen versagen manchmal. Dies ist ein frustrierender Prozess, da Tests nur einmal alle zehn oder hundert Läufe fehlschlagen können - abhängig davon, wie viele Attribute und mögliche Werte vorhanden sind und welche Kombination den Fehler auslöst. Sie müssen jedes beliebige zufällige Attribut in jeden Test auflisten, um es zu überschreiben, was albern ist. Also, Sie erstellen nicht-zufällige Fabriken und negieren damit jeden Vorteil der ursprünglichen Zufälligkeit. Man könnte argumentieren, wie Henrik Nyh, dass zufällige Werte helfen Ihnen Bugs zu entdecken. Wenn möglich, bedeutet das natürlich, dass Sie ein größeres Problem haben: Löcher in Ihrer Testsuite. Im schlimmsten Fall bleibt der Fehler immer noch unentdeckt; Im besten Fall erhalten Sie eine kryptische Fehlermeldung, die verschwindet, wenn Sie das nächste Mal den Test ausführen, macht es schwer zu debuggen. Richtig, ein kryptischer Fehler ist besser als kein Fehler, aber randomisierten Fabriken bleiben ein schlechter Ersatz für ordnungsgemäße Komponententests, Code-Review und TDD, um diese Probleme zu verhindern.

Randomisierte Fabriken sind daher nicht nur nicht die Mühe wert, sie geben Ihnen sogar falsches Vertrauen in Ihre Tests, die schlechter als ohne Tests ist.

Aber es gibt nichts, was dich daran hindert, es zu tun, wenn du willst, mach es einfach.

Oh, und es gibt eine noch einfachere Möglichkeit, eine Sequenz in der letzten FactoryGirl zu inline, das Zitat wurde für eine ältere Version geschrieben.

+0

Danke Jrochkind, viel schätzen den Link auch, interessant, dass er einen Link zu diesem [Henrik Nyh Beitrag] (http://thepugautomatic.com/2012/07/randomize-your-factories/) listet, finde ich mich zutiefst versucht durch diesen Ansatz und Aefs Beitrag oben. Aber ich denke, Arjan van der Gaag macht einen guten Fall, dass die Verwendung von Fälschern "ein schlechter Ersatz für richtige Komponententests, Code-Review und TDD ist, um diese Probleme zu verhindern." Danke allen für die Perspektiven. – Huw

+0

Irgendwann wird es so viel kombinatorische Komplexität in wachsenden Projekten geben, dass Sie Lücken in der Testabdeckung haben werden, auch wenn es 100% auf dem Papier ist. Und wie ich in meiner Antwort gesagt habe, hat die Mühe, die Sie beim Bau der Fabriken haben, normalerweise keine zusätzlichen Kosten, weil Sie es sowieso tun könnten, wenn Sie in der Lage sein möchten, Kunden mit anständigen, nicht personalisierten Demodaten leicht zu präsentieren. – aef

1

Ich benutze gerne Faker und normalerweise tun, wenn Sie mit größeren Code-Basen arbeiten. Ich sehe die folgenden Vor- und Nachteile bei der Verwendung von Faker mit Factory Girl:

Mögliche Nachteile:

  • Ein bisschen schwieriger, das exakt gleiche Testszenario zu reproduzieren (zumindest RSpec um dies funktioniert durch den Zufallszahlengenerator Anzeige jedes Mal, Samt und ermöglicht es Ihnen, die exakt gleichen Test mit ihm)
  • generieren von Daten verschwenden ein wenig Leistung

Mögliche Vorteile zu reproduzieren:

  • Macht die Anzeige von Daten in der Regel verständlicher. Bei der manuellen Erstellung von Testdaten neigen die Benutzer zu allen Arten von Abkürzungen, um die Langweiligkeit zu vermeiden.
  • Die gleichzeitige Erstellung von Fabriken mit Faker für Tests bietet Ihnen die Möglichkeit, schöne Demo-Daten für Präsentationen zu erstellen.
  • Sie könnten zufällig Rand Fall Fehler entdecken, wenn die Tests viel laufen
+0

Danke Aef, das ist eine schöne Zusammenfassung - kannst du mit Michals Punkt oben sprechen? Denkst du, dass dies eine Grundlage für Tests mit bekannten Werten verletzt? Auch wenn Sie sagen, dass es schöne Testdaten für Demos gibt, denke ich, dass Sie dort über Seedateien sprechen? Wie wirkt sich das auf die Verwendung von Fabriken für Tests aus? Verwenden Sie Fabriken in Ihrer Seed-Datei? – Huw

+0

Was ich beim Schreiben von Tests sehr oft erfahre, ist, dass es oft egal ist, was der tatsächliche Wert ist, aber mehr, dass es der gleiche Wert ist, der irgendwo durch irgendeinen Code geleitet wird und entweder genau gleich oder modifiziert zurückgegeben wird ein spezifischer Weg. Hier ist es egal, ob der Wert fest oder zufällig ist. Die Faker-Daten bieten weiteren Nutzen, da sie versuchen, näher an den realen Daten zu liegen, damit Menschen sie beim Debuggen besser verstehen können. Wenn der Inhalt des Wertes für den Test wichtig ist, verwenden Sie Faker normalerweise nicht dafür. – aef

+0

Normalerweise definiere ich die Fabriken als (möglicherweise optionalen) Teil meiner Hauptcode-Basis, anstatt sie mit dem Testcode zu bündeln. Dann kann ich überall Demo-Daten erstellen, sei es in einer Seed-Datei oder in einer Live-Konsole oder wirklich in jedem anderen Kontext, den ich mir wünsche. – aef

1

Es liegt an Ihnen.

Meiner Meinung nach ist es eine sehr gute Idee, zufällige Daten in Tests zu haben, und es hat mir immer geholfen, Bugs und Eckfälle zu entdecken, an die ich nicht gedacht habe.

Ich bereue nie, zufällige Daten zu haben. Alle von @jrochkind beschriebenen Punkte wäre richtig (und Sie sollten die andere Antwort vor dem Lesen dieses man lesen), aber es ist auch wahr, dass Sie kann (und sollte) schreiben, dass in Ihrem spec_helper.rb

config.before(:all) { Faker::Config.random = Random.new(config.seed) } 

dies so machen dass Sie wiederholbare Tests mit wiederholbaren Daten haben. Wenn Sie das nicht tun, haben Sie alle Probleme, die in der anderen Antwort beschrieben sind.

+0

Ich mag diese Antwort besonders, bekomme ich genug Zufälligkeit zunächst, um sicherzustellen, dass ich meine anfänglichen Erwartungen, aber Wiederholbarkeit testen kann, wenn ich es brauche, danke @coorasse :) – Huw

Verwandte Themen