Re: preforking prove
[email protected] (Jonathan Swartz)
| Newsgroups | perl.qa |
|---|---|
| Message-ID | <[email protected]> |
Now on cpan. A much simpler solution than what I suggested :) and apparently still works with parallel testing. Thanks miyagawa! https://metacpan.org/module/forkprove On Nov 6, 2012, at 9:58 AM, Jonathan Swartz wrote: > 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 >> >