Tag: SAS

NOTE: Macro Coverage in Testing (MCOVERAGE)

Yesterday I introduced the MCOVERAGE system option (introduced in V9.3) for capturing coverage of macro execution. This is useful in testing, to be sure you executed all lines of your macro. This may take more than one execution of your macro, with different input parameters and data.

I finished yesterday’s post by showing the mcoverage log file created from the execution of a sample macro. I’ve listed all three files below. They are:

  1. The program that I ran
  2. The mcoverage log file
  3. The macro source for %fred (with line numbers added; the blank lines were intentional, to show how they are dealt with by MCOVERAGE)

filename MClog "~/mcoverage1.log";

options mcoverage mcoverageloc=MClog;

%fred(param=2);

filename MClog clear;

* BUT, see my note about closing MClog at
the end of yesterday's blog post;

1 1 18 FRED
2 1 1 FRED
3 17 17 FRED
2 1 1 FRED
2 2 2 FRED
2 3 3 FRED
2 4 4 FRED
2 4 4 FRED
2 4 4 FRED
2 5 5 FRED
2 6 6 FRED
2 7 7 FRED
2 8 8 FRED
2 8 8 FRED
2 9 9 FRED
2 13 13 FRED
2 18 18 FRED

1.
2. %macro fred(param=2);
3. * comment ;
4. %put hello world: ¶m;
5. %if 1 eq 1 %then %put TRUE;
6. %if 1 eq 1 %then
7. %do;
8. %put SO TRUE;
9. %end;
10. %if 1 eq 0 %then
11. %do;
12. %put FALSE;
13. %end;
14. %if &param eq 1 %then
15. %do;
16. %put FOUND ME;
17. %end;
18.
19. %mend fred;
20.

The SAS 9.4 Macro Language: Reference manual tells us that the format of the coverage analysis data is a space delimited flat text file that contains three types of records. Field one of the log file contains the record type indicator. The record type indicator can be:

  • 1 = indicates the beginning of the execution of a macro. Record type 1 appears once for each invocation of a macro
  • 2 = indicates the lines of a macro that have executed. A single line of a macro might cause more than one record to be generated.
  • 3 = indicates which lines of the macro cannot be executed because no code was generated from them. These lines might be either commentary lines or lines that cause no macro code to be generated.

We can see examples of these in the listing shown above. The second and third fields contain the starting and ending record number, and the fourth field contains the name of the macro (you figured that out yourself, right?).

So, record type 1 from our log is telling us that %fred is 18 lines long; record type 3 is telling us that line 17 has no executable elements within it (because it’s blank); and the record type 2 lines are telling us which code lines were executed. By implication, lines of code that were not executed don’t feature in the mcoverage log. How do we interpret all of this?

The first thing to note is that the line numbers shown in the mcoverage log are relative to the %macro statement and hence don’t align with our own line numbers (I deliberately included a blank first and last line in the fred.sas file in order to demonstrate this). The type 2 records show that all lines were executed by our test except 10-12 and 14-17 (these are numbered 11-13 and 15-18 above). Given the logic and the fact that we supplied param=2 when we executed the macro (see yesterday’s post), this would seem understandable/correct.

However, surely we can write a quick bit of SAS code to do the brainwork for us and show which lines were executed and which weren’t. Of course we can, and I’ll show an example program to do this tomorrow…

MCOVERAGE:

NOTE: Macros Newness in 9.4 and 9.3 (MCOVERAGE), 6-Jan-2014
NOTE: Macro Coverage in Testing (MCOVERAGE), 7-Jan-2014 (this article!)
NOTE: Making Sense of MCOVERAGE for Coverage Testing of Your Macros, 8-Jan-2014
NOTE: Expanding Our Use of MCOVERAGE for Coverage Analysis of our Macro Testing, 9-Jan-2014
NOTE: Wrap-Up on Test Coverage and MCOVERAGE, 10-Jan-2014


Follow me on Twitter: @aratcliffeuk

See an audiovisual recording on my SAS Global Forum 2013 paper Visual Techniques for Problem Solving and Debugging

NOTE: Broadening Access to the BI Lineage Plug-In

Metacoda’s Paul Homes recently wrote a most informative article entitled Providing User Access to the SAS BI Lineage Plug-in. As Paul says in his article, the BI Lineage plug-in can be used to do impact analysis for BI content (reports, informatio…

NOTE: Macros Newness in 9.4 and 9.3 (MCOVERAGE)

The SAS macro language is almost as old as SAS itself (who knows exactly?) so you’d think the need to add new functionality would have ceased – particularly with the ability to access most DATA step functions through %sysexec. But apparently not…SAS …

NOTE: Metadata-Bound Libraries for Dummies

As I said in yesterday’s My 2013 Top Ten article, I think that metadata-bound libraries (introduced in V9.3 maintenance 2) are one of the most significant SAS enhancements for some time. It seems SAS’s Chris Hemedinger agrees. Read his Closing the “LIB…

My 2013 Top Ten

Last week I published the ten blog articles that scored most hits over the last 18 months. That was “your” top ten. I thought I’d offer an alternative top ten by listing the articles that I most enjoyed writing or which I personally thought were of the…

Turing Pardoned!

In December 2012 I wrote of my family’s visit to Bletchley Park in Central England. Bletchley has a remarkable history and we enjoyed discovering its contribution to computer science along with that of Alan Turing.In the article, I mentioned the tragic…

Your "2013" Top Ten

It’s nearing the end of the year so I thought I’d publish a list of the ten most viewed articles published this year. Like last year, I realised that this would be skewed in favour of older articles. So, in an effort to bring balance, I decid…

NOTE: Have You Won Yet?

Are you checking the SAS advent calendar daily, and entering the prize draw? Have you won anything yet? I have not, but I did win a very informative book a couple of years ago. Opening the windows in the advent calendar is an annual treat. Last year …