[LRUG] Large Slow Test Suites
Sam Livingston-Gray
geeksam at gmail.com
Thu Dec 5 07:54:41 PST 2013
I just put a require statement at the top of the fast test file for what I'm testing, and another one for anything it depends on. When that gets to be annoying, I know I have too many dependencies. ;)
--
(Sent from phone. Please excuse: brevity, top posting, hilarious autocorrections.)
> On Dec 5, 2013, at 7:29 AM, Jon Leighton <j at jonathanleighton.com> wrote:
>
> Hi Tom,
>
>> On 05/12/13 09:28, Mr Jaba wrote:
>> Interesting points on making your unit tests independent of Rails, I
>> hadn't considered the class reloading aspect. Does this interfere very
>> badly? Is it avoidable at all? Or was the cost of maintaining all the
>> requires simply too high?
>
> If you want to run your tests outside of Rails, you can't rely on the
> rails autoloading mechanism (ActiveSupport::Dependencies). But if you
> put requires all over the place, it will prevent AS::Dependencies from
> working when you *do* want it to (i.e. code reloading in dev mode won't
> work, because the code was loaded by a require rather than a missing
> constant).
>
> The solution I ended up with was basically using require_dependency
> rather than require, and stubbing out require_dependency for my "outside
> Rails" tests. It was nasty.
>
> In might be possible to *just* use AS::Dependencies in your unit tests,
> without loading the full Rails app. That's something I didn't try, but
> with spring loading the full app is not such a big deal for me these
> days anyway, so I don't see the benefit of having tests that can run
> outside of the Rails app.
>
> Jon
>
>>
>> Thanks again
>>
>> Tom
>>
>>
>> On 5 December 2013 09:04, Jon Leighton <j at jonathanleighton.com
>> <mailto:j at jonathanleighton.com>> wrote:
>>
>> Hi Tom,
>>
>>> On 04/12/13 22:56, Mr Jaba wrote:
>>> First up, thanks for Spring (amongst your many other contributions!)
>>> it's a really useful gem!
>>
>> Glad you like it!
>>
>>> With regards to the factories, what do you recommend instead? Simpler
>>> objects with less coupling to Rails?
>>
>> Yeah I don't like the factories approach at all. Apart from often being
>> a source of test slowness, they encourage you down the path of high
>> coupling and make it too trivial to create a boat load of
>> database-backed objects. Bo Jeanes wrote a post about this:
>> http://bjeanes.com/2012/02/factories-breed-complexity
>>
>> There are certainly situations in a Rails app where you need to test
>> against the database. For this I use fixtures, which I find perfectly
>> adequate and much faster than factories. You do need to ensure your
>> fixtures don't get out of control, but generally I think of fixtures as
>> a handful of pre-inserted records that I might modify in specific tests
>> in order to achieve a certain thing (rather than creating a new fixture
>> entry for each thing, which can get out of hand).
>>
>> Apart from that, it's obviously wise to avoid inserting stuff in the
>> database as much as possible, e.g. if you just want to test the logic of
>> a certain method which only interacts with a model's attributes, you can
>> just create an in-memory instance.
>>
>> I have been down the path of making my "unit tests" independent of the
>> Rails app so as to avoid the boot process, and found it impractical to
>> be honest:
>>
>> 1) You end up with require and require_dependency everywhere, and it's
>> hard to get this right in a way that plays nicely with Rails' class
>> reloading
>> 2) Even if you make some tests independent of Rails, you're still going
>> to need some that are not independent of Rails, so you only solve part
>> of the problem
>>
>> This was part of my motivation for spring - if we can't make get rid of
>> having to boot the Rails app, let's make booting the Rails app less
>> painful.
>>
>> Not sure any of these comments help with your current predicament, but
>> hopefully they're vaguely useful anyway!
>>
>> Jon
>>
>>>
>>> Thanks for your input!
>>>
>>> Tom
>>>
>>>
>>> On 4 December 2013 22:43, Jon Leighton <j at jonathanleighton.com
>> <mailto:j at jonathanleighton.com>
>>> <mailto:j at jonathanleighton.com <mailto:j at jonathanleighton.com>>>
>> wrote:
>>>
>>> Hello there,
>>>
>>>> On 04/12/13 22:20, Mr Jaba wrote:
>>>> I've recently taken ownership of a new project with a large
>> test suite
>>>> (2000ish tests), and the overall run time is around 30 minutes
>>> which is
>>>> certainly less than ideal!
>>>>
>>>> Now I know the general approach to "Fast Rails Tests" but
>> taking the
>>>> time to refactor the whole test suite is a bit too much
>> right now. I'm
>>>> wondering if anyone has experience of transforming a test
>> suite of
>>> this
>>>> magnitude to something a bit speedier? If so how did you go
>> about it?
>>>> What tips, tricks and techniques can you share?
>>>>
>>>> A bit more info:
>>>>
>>>> - Test::Unit tests, moving to Minitest
>>>> - Rails 3.2.16
>>>> - Running parallel_tests shaved 5 mins off the time
>>>> - Using Spring to reduce Rails load time.
>>>>
>>>> Any advice gratefully received!
>>>
>>> I think you need to provide some more information :) What's
>> making it
>>> take so long - the sheer number of tests or what the tests are
>> doing? Do
>>> you have certain types of tests that are taking a large
>> portion of the
>>> time (e.g. Capybara tests?) Are you using factories? In my
>> experience
>>> factories are an easy cause of a slow test suite.
>>>
>>> One thing to think about is whether you can break up your test
>> suite.
>>> For example in the application I work on, we have
>> unit/integration tests
>>> which run in about 25 seconds on my machine. I frequently run
>> these
>>> during development and they often alert me to problems. But I
>> rarely run
>>> the full set of capybara tests which takes several minutes - I
>> let the
>>> CI do that and run failing tests individually where necessary.
>> This
>>> achieves a decent balance of fast feedback for development without
>>> throwing away the safety net of proper full-stack tests.
>>>
>>> Jon
>>> _______________________________________________
>>> Chat mailing list
>>> Chat at lists.lrug.org <mailto:Chat at lists.lrug.org>
>> <mailto:Chat at lists.lrug.org <mailto:Chat at lists.lrug.org>>
>>> http://lists.lrug.org/listinfo.cgi/chat-lrug.org
> _______________________________________________
> Chat mailing list
> Chat at lists.lrug.org
> http://lists.lrug.org/listinfo.cgi/chat-lrug.org
More information about the Chat
mailing list