miyagawa sent me this proof of concept - using fork, not starman. personally I 
like the opportunity to combine with parallel testing. :)
-----
proof of concept - https://gist.github.com/4024197

* using Shotgun loader (plackup -L Shotgun) would make a clean environment for 
perl to run test for each request, while still preloading modules with -M. 
Combined with Starman, you'll get a benefit of running multiple workers for 
parallel testing.

* But if you just need to preload modules to run tests, using fork() like above 
is much easier and involves no HTTP server etc :)

* My POC above seems to work fine (I will probably make a github repo later), 
but it fails in some tests (with Moose, only a couple of tests fail) and it 
runs almost twice as fast. It is important to remember NOT to preload 
Test::More (and Test::Builder) in the parent process because doing so will mess 
up things.

On Nov 5, 2012, at 5:03 PM, Jonathan Swartz wrote:

> We have a large slow test suite at work (Test::Class, 225 classes, about 45 
> minutes run time). Many of the tests start by loading a bunch of the same 
> modules. Obviously we could speed things up if we could share that loading 
> cost.
> 
> I'm aware of Test::Aggregate and Test::Aggregate::Nested, but a number of our 
> tests run into the caveats (e.g. they change singletons -- yes, this is not 
> ideal, but also not easily changeable).
> 
> I thought of an alternative to Test::Aggregate called "preforking prove", or 
> pfprove, which does the following:
> 
> * Accepts the same arguments as prove
> * Preloads the module(s) in -M
> * Launches a Starman server in the background
> * For each test file, makes a request to the Starman server. The Starman 
> child runs the  test and exits.
> 
> The idea is that you preload all the common stuff in the Starman parent, so 
> that forking each child and running each test is fast (at least on Linux).
> 
> Potential advantages over Test::Aggregate:
> * runs one test per process, so avoids some caveats
> * keeps the TAP in traditional form (one TAP stream per file)
> * works well with parallel prove
> 
> Potential disadvantages:
> * lots of extra complexity (requires Starman or similar, need to make sure it 
> shuts down, need to handle errors, etc.)
> 
> Curious what you think. Is there something like this out there already? 
> Potential problems?
> 
> If I do this I might call it Test::Aggregate::Preforking, just to keep it in 
> the same category.
> 
> Thanks!
> Jon
> 

Reply via email to