One thing I’ve always missed in phpt is code coverage reports, not lcov since I’m talking about testing userland code, kinda like we have in PHPUnit so I decided to implement it in pear run-tests so that I could check out how much code I’ve made tests for in PEAR and other projects where I utilize the phpt format.
So the first thing I had to figure out was the RunTest code in PEAR, it’s a old port of php run-tests and hadn’t really been updated to any real extent, mostly just adding features here and there, so what I did was to split it up into multiple functions so that it would be easier to understand the beast, run() was 700+ lines IIRC and in this process I managed to find a good amount of redundant code that we could throw out, yay! :) So the next step was to figure out how to make XDebug only provide coverage reports for only the tests and the code they run and not to include the RunTest code in the equation with out me having to filter it out, and then a very ugly solution dawned on me, I’d have to inject the XDebug start / stop / get coverage code into RunTest, OH MY GOD! :-/
But for those that understand how we execute tests this will make a lot of sense, because each test gets it’s own php process, we use proc_* for that, and why might one ask and the answer is simple, mainly to test PHP fatal errors and code that uses exit/die as well as being able to define our own ini options that the process will use (enable safe mode, disable magic quote and things like that) … There might be some other reasons but these are the most important IMHO.
Tho the first two reasons caused me some headache, since of course fetching the coverage info and throwing it into a file won’t work if a PHP Fatal error occurs or if a die/exit get processed in the test since it’s done at the end of each test, so I had a little chat with Derick to see if we could find some proper solution for that challenge and he said he was going to look into it for XDebug 2.1, yay for Derick :-D So to sum up a little I take the FILE part, detect the first and inject the start / get coverage / stop XDebug code as well as var_export($xdebug, true); and write that to a file in the same dir as the test with the file ending .xdebug (name can change, just seemed the most straight forward at the time :P) and hurray we have a file that contains a valid PHP array with the coverage info! :D
This isn’t a silver bullet, it needs some more work and a renderer package to make those pretty graphs and progress bars, like we have at gcov.php.net or similar but at least it’s progressing into the right direction and I’m pretty happy if it becomes useful to only handful of people, if more use it then I’ll be thrilled.
So anyone up to helping with the renderer package ? :-)