Factory Girl has been getting some hardcore internal refactorings over the past few months. Traits are a great example of something that’s started very bare-bones with a few caveats and been transformed to one of my favorite features of the Factory Girl syntax. It required a pretty decent chunk of refactoring and there were bugs for quite a while due to the way attributes in general were handled.
The Old Way
Internally, Factory Girl has four different types of attributes (Dynamic,
Static, Association, and Sequence); when compiling attributes, we were sorting
attributes by the order attributes were added, moving all static attributes to
the beginning of the list (with a
priority attribute). This worked for 99% of
all cases but did have bugs (the most recent involved traits and dynamic
attributes). I wanted to
resolve this once and for all.
The New Way
Factory Girl now creates a new class per factory (with some awesome usage of
defines methods on that class for each attribute declared in the factory files.
This means Factory Girl doesn’t have to worry about sorting attributes anymore;
every attribute is effectively lazily-evaluated so it’ll return the correct
value every time. Factory Girl also uses inheritance for these anonymous
classes, resulting in a pretty significant speedup of factory interaction
(namely because we were copying all parent attributes and callbacks to each
child to mimic inheritance before).
What Does It Mean
Factory Girl is now faster!
Here’s some benchmarks from Factory Girl 2.3.0:
user system total real build x10000 4.920000 0.010000 4.930000 ( 5.028088) trait build x10000 6.180000 0.010000 6.190000 ( 6.296030) inline trait build x10000 5.870000 0.010000 5.880000 ( 5.989512) deep build x10000 8.100000 0.020000 8.120000 ( 8.285039) attributes_for x10000 3.200000 0.010000 3.210000 ( 3.289043) create x500 1.010000 0.320000 1.330000 ( 4.186271)
And from Factory Girl 2.4.0:
user system total real build x10000 3.050000 0.000000 3.050000 ( 3.121359) trait build x10000 3.260000 0.010000 3.270000 ( 3.353590) inline trait build x10000 6.700000 0.040000 6.740000 ( 7.037460) deep build x10000 3.400000 0.010000 3.410000 ( 3.503984) attributes_for x10000 0.820000 0.010000 0.830000 ( 0.886641) create x500 0.710000 0.310000 1.020000 ( 3.980102)
Grab a copy of Factory Girl 2.4.0 and speed up your suite!