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