SASUnit Examples  Version 1.2
reportsasunit.sas
Go to the documentation of this file.
1 
28 /* change log
29  29.01.2013 KL changed link from _sasunit_doc.sas to Sourceforge SASUnit User's Guide
30  28.01.2013 KL Adjusted descriptions of testcases
31  08.01.2013 KL Empty cells are rendered incorrectly in MS IE. So   is now used as contents of an empty cell
32  15.07.2009 AM fixed copydir for Linux
33  13.08.2008 AM introduced o_force and o_output
34  12.08.2008 AM Reportingsprache umgestellt
35  11.08.2008 AM Dateiname der Frameseite an Reportgenerator für assertReport übergeben
36  05.02.2008 AM assertManual nach assertReport umgestellt
37  29.12.2007 AM Aufruf reportAuton aufgenommen
38 */
39 
40 %MACRO reportSASUnit (
41  i_language = EN
42  ,o_html = 1
43  ,o_force = 0
44  ,o_output =
45 );
46 %LOCAL l_macname; %LET l_macname=&sysmacroname;
47 
48 /*-- check parameters --------------------------------------------------------*/
49 %IF "&o_html" NE "1" %THEN %LET o_html=0;
50 
51 %IF "&o_force" NE "1" %THEN %LET o_force=0;
52 
53 %_sasunit_nls (i_language=&i_language)
54 
55 /*-- check if target folder exists -------------------------------------------*/
56 %LOCAL l_output;
57 %IF %length(&o_output) %THEN %LET l_output=&o_output;
58 %ELSE %LET l_output =&g_target/rep;
59 %LET l_output=%_sasunit_abspath(&g_root,&l_output);
60 
61 %IF %_sasunit_handleError(&l_macname, InvalidOutputDir,
62  NOT %_sasunit_existDir(&l_output),
63  Error in parameter o_output: target folder does not exist)
64  %THEN %GOTO errexit;
65 
66 /*-- check if test database can be accessed ----------------------------------*/
67 %IF %_sasunit_handleError(&l_macname, NoTestDB,
68  NOT %sysfunc(exist(target.tsu)) OR NOT %symexist(g_project),
69  %nrstr(Test database cannot be accessed, call %initSASUnit before %reportSASUnit))
70  %THEN %GOTO errexit;
71 
72 /*-- generate temporary datasets ---------------------------------------------*/
73 %LOCAL
74  d_rep
75  d_scn
76  d_cas01
77  d_auton
78  d_pgm
79  d_pcs
80  d_emptyscn
81  d_cas
82  d_tst
83 ;
84 %_sasunit_tempFilename(d_rep)
85 %_sasunit_tempFilename(d_scn)
86 %_sasunit_tempFilename(d_cas01)
87 %_sasunit_tempFilename(d_auton)
88 %_sasunit_tempFilename(d_pgm)
89 %_sasunit_tempFilename(d_pcs)
90 %_sasunit_tempFilename(d_emptyscn)
91 %_sasunit_tempFilename(d_cas)
92 %_sasunit_tempFilename(d_tst)
93 
94 
95 /*-- check for empty scenarios and generate entries in temporary copies of cas and tst datasets,
96  in order to make scenario appear in report with a dummy test case --------------------------- */
97 %LOCAL
98  l_sEmptyScnDummyCasDesc
99 ;
100 %LET l_sEmptyScnDummyCasDesc = %STR(no valid test case found - must be red!);
101 
102 PROC SQL NOPRINT;
103  CREATE TABLE &d_emptyscn. AS
104  SELECT
105  t1.scn_id
106  FROM target.scn t1
107  WHERE t1.scn_id NOT IN
108  (
109  SELECT
110  Distinct cas_scnid
111  FROM target.cas
112  )
113  ;
114 QUIT;
115 
116 
117 PROC SQL NOPRINT;
118  CREATE TABLE &d_cas. AS
119  SELECT
120  t1.*
121  FROM target.cas t1
122  ;
123  INSERT INTO &d_cas.
124  (
125  cas_scnid
126  ,cas_id
127  ,cas_auton
128  ,cas_pgm
129  ,cas_desc
130  ,cas_spec
131  ,cas_start
132  ,cas_end
133  ,cas_res
134  )
135  (
136  SELECT
137  scn_id
138  ,1
139  ,0
140  ,' '
141  ,"&l_sEmptyScnDummyCasDesc."
142  ,' '
143  ,.
144  ,.
145  ,1
146  FROM &d_emptyscn.
147  )
148  ;
149 QUIT;
150 
151 PROC SQL NOPRINT;
152  CREATE TABLE &d_tst. AS
153  SELECT
154  t1.*
155  FROM target.tst t1
156  ;
157  INSERT INTO &d_tst.
158  (
159  tst_scnid
160  ,tst_casid
161  ,tst_id
162  ,tst_type
163  ,tst_desc
164  ,tst_exp
165  ,tst_act
166  ,tst_res
167  )
168  (
169  SELECT
170  scn_id
171  ,1
172  ,0
173  ,' '
174  ,' '
175  ,' '
176  ,' '
177  ,1
178  FROM &d_emptyscn.
179  )
180  ;
181 QUIT;
182 
183 /*-- generate a last-flag for treeview ---------------------------------------*/
184 PROC SORT DATA=target.scn OUT=&d_scn;
185  BY scn_id;
186 RUN;
187 DATA &d_scn;
188  SET &d_scn END=eof;
189  scn_last = eof;
190 RUN;
191 
192 PROC SORT DATA=&d_cas OUT=&d_cas01;
193  BY cas_scnid cas_id;
194 RUN;
195 DATA &d_cas01;
196  SET &d_cas01;
197  BY cas_scnid;
198  cas_last = last.cas_scnid;
199  cas_pgmucase = upcase(cas_pgm);
200 RUN;
201 
202 PROC SORT DATA=&d_cas (KEEP=cas_auton RENAME=(cas_auton=auton_id))
203  OUT=&d_auton NODUPKEY;
204  BY auton_id;
205 RUN;
206 DATA &d_auton;
207  SET &d_auton END=eof;
208  auton_last = eof;
209 RUN;
210 
211 data &d_pgm;
212  SET &d_cas (KEEP=cas_auton cas_pgm RENAME=(cas_auton=pgm_auton cas_pgm=pgm_ucase));
213  pgm_ucase = upcase(pgm_ucase);
214 RUN;
215 PROC SORT DATA=&d_pgm NODUPKEY;
216  BY pgm_auton pgm_ucase;
217 RUN;
218 DATA &d_pgm;
219  SET &d_pgm;
220  BY pgm_auton;
221  IF first.pgm_auton THEN pgm_id=0;
222  pgm_id+1;
223  pgm_last = last.pgm_auton;
224 RUN;
225 
226 DATA &d_pcs;
227  SET &d_cas (KEEP=cas_auton cas_pgm cas_scnid cas_id RENAME=(cas_auton=pcs_auton cas_pgm=pcs_ucase cas_scnid=pcs_scnid cas_id=pcs_casid));
228  pcs_ucase = upcase(pcs_ucase);
229 PROC SORT DATA=&d_pcs OUT=&d_pcs NODUPKEY;
230  BY pcs_auton pcs_ucase pcs_scnid pcs_casid;
231 RUN;
232 DATA &d_pcs;
233  SET &d_pcs;
234  BY pcs_auton pcs_ucase;
235  pcs_last = last.pcs_ucase;
236 RUN;
237 
238 /*-- create reporting dataset ------------------------------------------------*/
239 %LOCAL i;
240 PROC SQL NOPRINT;
241  CREATE TABLE &d_rep (COMPRESS=YES) AS
242  SELECT
243  tsu_project
244  ,tsu_root
245  ,tsu_target
246  ,tsu_sasunit
247  ,tsu_sasautos
248 %DO i=1 %TO 9;
249  ,tsu_sasautos&i
250 %END;
251  ,tsu_autoexec
252  ,tsu_sascfg
253  ,tsu_sasuser
254  ,tsu_testdata
255  ,tsu_refdata
256  ,tsu_doc
257  ,tsu_lastinit
258  ,tsu_lastrep
259  ,scn_id
260  ,scn_path
261  ,scn_desc
262  ,scn_start
263  ,scn_end
264  ,scn_rc
265  ,scn_res
266  ,scn_errorcount
267  ,scn_warningcount
268  ,scn_last
269  ,cas_id
270  ,cas_auton
271  ,auton_last
272  ,cas_pgm
273  ,pgm_id
274  ,pgm_last
275  ,pcs_last
276  ,cas_desc
277  ,cas_spec
278  ,cas_start
279  ,cas_end
280  ,cas_res
281  ,cas_last
282  ,tst_id
283  ,tst_type
284  ,tst_desc
285  ,tst_exp
286  ,tst_act
287  ,tst_res
288  FROM
289  target.tsu
290  ,&d_scn
291  ,&d_cas01.
292  ,&d_tst
293  ,&d_auton
294  ,&d_pgm
295  ,&d_pcs
296  WHERE
297  scn_id = cas_scnid AND
298  cas_scnid = tst_scnid AND
299  cas_id = tst_casid AND
300  cas_auton = auton_id AND
301  cas_auton = pgm_auton AND
302  cas_pgmucase = pgm_ucase AND
303  cas_auton = pcs_auton AND
304  cas_pgmucase = pcs_ucase AND
305  cas_scnid = pcs_scnid AND
306  cas_id = pcs_casid
307  ;
308  CREATE UNIQUE INDEX idx1 ON &d_rep (scn_id, cas_id, tst_id);
309  CREATE UNIQUE INDEX idx2 ON &d_rep (cas_auton, pgm_id, scn_id, cas_id, tst_id);
310 
311 QUIT;
312 %IF %_sasunit_handleError(&l_macname, ErrorTestDB,
313  &syserr NE 0,
314  %nrstr(Fehler beim Zugriff auf die Testdatenbank))
315  %THEN %GOTO errexit;
316 
317 /*-- determine last run ------------------------------------------------------*/
318 %LOCAL
319  l_lastrun
320  l_bOnlyInexistingScnFound
321 ;
322 PROC SQL NOPRINT;
323  SELECT coalesce(max(scn_start),0) FORMAT=12.0 INTO :l_lastrun FROM target.scn;
324 QUIT;
325 
326 /*-- determine whether only invalid scenarios are present (were not run, but shall be reported) ---*/
327 %LET l_bOnlyInexistingScnFound = 1;
328 DATA _NULL_;
329  SET target.scn ( KEEP = scn_start );
330  IF scn_start > 0 THEN DO;
331  /* 'real' scenario found */
332  Call Symputx ('l_bOnlyInexistingScnFound', '0');
333  STOP;
334  END;
335 RUN;
336 
337 /*-- report generator --------------------------------------------------------*/
338 FILENAME repgen temp;
339 
340 DATA _null_;
341  SET &d_rep;
342  BY scn_id cas_id;
343  FILE repgen;
344 
345  IF _n_=1 THEN DO;
346  /*-- only if testreport is generated competely anew --------------------*/
347  IF tsu_lastrep=0 OR &o_force THEN DO;
348  /*-- copy static files - images, css etc. ---------------------------*/
349  PUT '%_sasunit_copydir(' /
350  " &g_sasunit" '/html/%str(*.*)' /
351  " ,&l_output" /
352  ")";
353  /*-- create frame HTML page -----------------------------------------*/
354  PUT '%_sasunit_reportFrameHTML(' /
355  " i_repdata = &d_rep" /
356  " ,o_html = &l_output/index.html" /
357  ")";
358  END;
359  /*-- only if testsuite has been initialized anew after last report -----*/
360  IF tsu_lastinit > tsu_lastrep OR &o_force THEN DO;
361  /*-- convert SAS-log from initSASUnit -------------------------------*/
362  PUT '%_sasunit_reportLogHTML(' /
363  " i_log = &g_log/000.log" /
364  " ,i_title = &g_nls_reportSASUnit_001" /
365  " ,o_html = &l_output/000_log.html" /
366  ")";
367  /*-- create overview page -------------------------------------------*/
368  PUT '%_sasunit_reportHomeHTML(' /
369  " i_repdata = &d_rep" /
370  " ,o_html = &l_output/overview.html" /
371  ")";
372  END;
373  /*-- only if a test scenario has been run since last report ------------*/
374  IF &l_lastrun > tsu_lastrep OR &l_bOnlyInexistingScnFound. OR &o_force. THEN DO;
375  /*-- create table of contents ---------------------------------------*/
376  PUT '%_sasunit_reportTreeHTML(' /
377  " i_repdata = &d_rep" /
378  " ,o_html = &l_output/tree.html" /
379  ")";
380  /*-- create list of test scenarios ----------------------------------*/
381  PUT '%_sasunit_reportScnHTML(' /
382  " i_repdata = &d_rep" /
383  " ,o_html = &l_output/scn_overview.html" /
384  ")";
385  /*-- create list of test cases --------------------------------------*/
386  PUT '%_sasunit_reportCasHTML(' /
387  " i_repdata = &d_rep" /
388  " ,o_html = &l_output/cas_overview.html" /
389  ")";
390  /*-- create list of units under test --------------------------------*/
391  PUT '%_sasunit_reportAutonHTML(' /
392  " i_repdata = &d_rep" /
393  " ,o_html = &l_output/auton_overview.html" /
394  ")";
395  END;
396  END;
397 
398  /*-- per scenario ---------------------------------------------------------*/
399  IF first.scn_id AND scn_id NE . THEN DO;
400  /*-- only if scenario has been run since report ------------------------*/
401  IF scn_start > tsu_lastrep OR &o_force THEN DO;
402  /*-- convert logfile of scenario ------------------------------------*/
403  PUT '%_sasunit_reportLogHTML(' /
404  " i_log = &g_log/" scn_id z3. ".log" /
405  " ,i_title = &g_nls_reportSASUnit_002 " scn_id z3. " (" cas_pgm +(-1) ")" /
406  " ,o_html = &l_output/" scn_id z3. "_log.html" /
407  ")";
408  END;
409  END;
410 
411  /*-- only if test case has been run since last report ---------------------*/
412  IF cas_start > tsu_lastrep OR &o_force THEN DO;
413 
414  /*-- per test case -----------------------------------------------------*/
415  IF first.cas_id AND scn_id NE . AND cas_id NE . THEN DO;
416  /*-- convert logfile of test case -----------------------------------*/
417  PUT '%_sasunit_reportLogHTML(' /
418  " i_log = &g_log/" scn_id z3. "_" cas_id z3. ".log" /
419  " ,i_title = &g_nls_reportSASUnit_003 " cas_id z3. " &g_nls_reportSASUnit_004 " scn_id z3. " (" cas_pgm +(-1) ")" /
420  " ,o_html = &l_output/" scn_id z3. "_" cas_id z3. "_log.html" /
421  ")";
422  /*-- compile detail information for test case -----------------------*/
423  PUT '%_sasunit_reportDetailHTML(' /
424  " i_repdata = &d_rep" /
425  " ,i_scnid = " scn_id z3. /
426  " ,i_casid = " cas_id z3. /
427  " ,o_html = &l_output/cas_" scn_id z3. "_" cas_id z3. ".html" /
428  ")";
429  END;
430 
431  /*-- per test assertColumns --------------------------------------------*/
432  IF scn_id NE . AND cas_id NE . AND tst_id NE . AND upcase(tst_type) = 'ASSERTCOLUMNS' THEN DO;
433  PUT '%_sasunit_reportCmpHTML(' /
434  " i_scnid = " scn_id z3. /
435  " ,i_casid = " cas_id z3. /
436  " ,i_tstid = " tst_id z3. /
437  " ,o_html = &l_output" /
438  ")";
439  END;
440 
441  /*-- per test assertLibrary --------------------------------------------*/
442  IF scn_id NE . AND cas_id NE . AND tst_id NE . AND upcase(tst_type) = 'ASSERTLIBRARY' THEN DO;
443  PUT '%_sasunit_reportLibraryHTML(' /
444  " i_scnid = " scn_id z3. /
445  " ,i_casid = " cas_id z3. /
446  " ,i_tstid = " tst_id z3. /
447  " ,o_html = &l_output" /
448  ")";
449  END;
450 
451  /*-- per test assertReport ---------------------------------------------*/
452  IF scn_id NE . AND cas_id NE . AND tst_id NE . AND upcase(tst_type) = 'ASSERTREPORT' THEN DO;
453  PUT '%_sasunit_reportManHTML(' /
454  " i_scnid = " scn_id z3. /
455  " ,i_casid = " cas_id z3. /
456  " ,i_tstid = " tst_id z3. /
457  " ,i_extexp= " tst_exp /
458  " ,i_extact= " tst_act /
459  " ,o_html = &l_output/_" scn_id z3. "_" cas_id z3. "_" tst_id z3. "_rep.html" /
460  " ,o_output= &l_output" /
461  ")";
462  END;
463 
464  END; /* if test case has been run since last report */
465 
466 RUN;
467 
468 /*-- create report -----------------------------------------------------------*/
469 ODS LISTING CLOSE;
470 %INCLUDE repgen / source2;
471 FILENAME repgen;
472 
473 /*-- save last report date ---------------------------------------------------*/
474 PROC SQL NOPRINT;
475  UPDATE target.tsu
476  SET tsu_lastrep = %sysfunc(datetime())
477  ;
478 QUIT;
479 
480 %GOTO exit;
481 %errexit:
482  %PUT;
483  %PUT ======================== Error! reportSASUnit aborted! ==========================================;
484  %PUT;
485  %PUT;
486 %exit:
487 PROC DATASETS NOWARN NOLIST LIB=work;
488  DELETE %scan(&d_rep,2,.) %scan(&d_scn,2,.) %scan(&d_cas01.,2,.) %scan(&d_cas.,2,.) %scan(&d_auton,2,.)
489  %scan(&d_pgm,2,.) %scan(&d_pcs,2,.) %scan(&d_emptyscn.,2,.);
490 QUIT;
491 %MEND reportSASUnit;