Wie kann ich die Erstellung von 5.000 Datensätzen für meine rspec-Tests beschleunigen?

9

Ich verwende Ruby on Rails 3.2.2, FactoryGirl 3.1.0, FactoryGirlRails 3.1.0, Rspec 2.9.0 und RspecRails 2.9.0. Um meine Anwendung zu testen, muss ich viele Datensätze (ca. 5000) in der Datenbank erstellen, aber diese Operation ist sehr langsam (es dauert mehr als 10 Minuten, um Datensätze zu erstellen). Ich gehe so vor:

%Vor%

Wie kann ich meinen Spezifikationscode verbessern, um schneller zu gehen?

Hinweis : Vielleicht ist die Langsamkeit gegeben durch (5) Artikelrückrufe, die vor und nach jedem Artikelerstellungsprozess ausgeführt werden, aber ich kann diese überspringen (da die einzigen Dinge, die ich testen muss, Artikel sind und nicht assoziierte Modelle) Wenn diese langsame Erstellung von Datensätzen ... ist es möglich, das zu machen und ist es der richtige Weg, um fortzufahren?

    
user12882 16.05.2012, 04:24
quelle

3 Antworten

2

Wenn Sie mit der Verarbeitung einer großen Anzahl von Datensätzen beginnen, ist es besser, dies direkt in sql zu tun, um den ActiveRecord-Aufwand zu vermeiden, den Sie nicht benötigen.
Ich würde versuchen, ein Skript zu schreiben oder eine gespeicherte Prozedur zu erstellen, um dies abhängig von Ihrer SQL-Implementierung zu tun. Es wird wahrscheinlich in ein paar Sekunden fertig sein.

    
Michael Durrant 16.05.2012 04:49
quelle
0

Ich bin kein Experte im Testen, aber ich denke, dass FactoryGirl diesen Nutzen nicht haben sollte. Es sollte nur einige Datensätze erstellen.

Überlegen Sie, ob Sie wirklich so viele Datensätze zum Testen brauchen, wenn ja, müssen sie vor jedem Test "zurückgesetzt" werden? (Ja, Sie erstellen sie vor jedem Test, so dass Sie tatsächlich 5000 * Anzahl_von_Tests erstellen). Ist ein rohe SQL-Skript keine Wahl? Wenn also Ihre Test-DB erstellt wird, werden alle diese Datensätze ebenfalls erstellt.

    
Ismael Abreu 16.05.2012 04:48
quelle
0

Wie andere bereits erwähnt haben, sollen Fabriken keine großen Mengen produzieren. Warum braucht ein vernünftiger Komponententest 5.000 Datensätze?

Das heißt, ein Teil des Grundes für die Verlangsamung ist, dass #create jeden Datensatz in der Datenbank speichert, nachdem er erstellt wurde. Wahrscheinlich möchten Sie stattdessen FactoryGirl.build verwenden. siehe Verwenden von Factories .

Natürlich werden Sie einen I / O-gebundenen Prozess für einen speichergebundenen Prozess handeln. Wenn das nicht das ist, was Sie wirklich wollen, sollten Sie #build in Betracht ziehen, um gerade genügend Datensätze für die einzelnen Tests zu instanziieren, oder verwenden Sie Fixture-Datei optimiert für Massenladungen.

    
Todd A. Jacobs 16.05.2012 04:59
quelle