IDL 8.4 adds a new routine, `CODE_COVERAGE` ([docs]), which returns information about the lines of a routine that have been executed. Using `CODE_COVERAGE` is fairly straight-forward — you do not need to enable code coverage. Just call `CODE_COVERAGE` at any time to find the lines of a routine that have been executed. Note that the routine must have been at least compiled before you call `CODE_COVERAGE` (even if you are clearing the status of the routine). Also, pay particular definition of the definition of a “line of code” in the [docs], e.g., empty lines, comments, and `END` statements do not count. Between the return value and the output from the `EXECUTED` keyword, you should get all the lines of code in a routine.
`CODE_COVERAGE` adds another useful developer tool to the timing routines like `PROFILER`[^1], `TIC` and `TOC`. I think `CODE_COVERAGE` has a range of uses, but most interesting for me is the ability to determine the coverage of your unit test suite, i.e., how much of my code base is executed by my test suite?
I have already implemented some basic test coverage information in my unit testing framework, [mgunit]. For example, mgunit can now tell me that I’m missing coverage of a few lines in the helper routines for `MG_SUBS`:
“mg_subs_ut” test case starting (5 tests)
test_basic: passed (0.000223 seconds)
test_derived: passed (0.000354 seconds)
test_derived2: passed (0.000369 seconds)
test_derived_perverse: passed (0.000477 seconds)
test_not_found: passed (0.000222 seconds)
Test coverage: 90.5%
mg_subs_iter: lines 135
mg_subs_getvalue: lines 72-73, 79
Completely covered routines
Results: 5 / 5 tests passed, 0 skipped
This means that after the unit tests have been run, line 135 from `MG_SUBS_ITER` and lines 72-73, 79 from `MG_SUBS_GETVALUE` have not been executed. This is useful (though not complete) information for determining if you have enough unit tests. Grab [mgunit] from the master branch on GitHub to give it a try (see [mglib] for an example of unit tests that take advantage of it). I’m not sure of the exact format for displaying the results, but I am fairly certain of the mechanism for telling the unit tests which routines it is testing (an `::addTestingRoutine` method). I intend to start using this for the unit tests of my products [GPULib] and [FastDL] soon!
[docs]: http://www.exelisvis.com/docs/CODE_COVERAGE.html “CODE_COVERAGE (IDL Reference)”
[mgunit]: http://github.com/mgalloy/mgunit “mgalloy/mgunit”
[mglib]: http://github.com/mgalloy/mglib “mgalloy/mglib”
[GPULib]: http://www.txcorp.com/home/gpulib “GPULib”
[FastDL]: http://www.txcorp.com/fastdl “FastDL”
[^1]: There is also a `CODE_COVERAGE` keyword to `PROFILER` now that displays the number of lines of a routine that were executed.