SASUnit Examples  Version 1.3.0
runsasunit.sas
Go to the documentation of this file.
1 
40 %MACRO runSASUnit(i_source =
41  ,i_recursive = 0
42  );
43 
44  %LOCAL
45  l_macname
46  d_dir
47  d_examinee
48  l_source
49  l_nscn
50  i
51  l_auto
52  l_autonr
53  l_scn
54  l_scnid
55  l_dorun
56  l_scndesc
57  l_sysrc
58  l_rc
59  l_scnlogfullpath
60  l_filled
61  l_lstfile
62  l_error_count
63  l_warning_count
64  l_result0
65  l_result1
66  l_result2
67  l_result
68  l_nscncount
69  l_c_scnid
70  l_sysrc
71  ;
72 
73  %LET l_macname=&sysmacroname;
74 
75  %_tempFileName(d_dir);
76  %_tempFileName(d_examinee);
77 
78  /*-- check if testdatabase can be accessed -----------------------------------*/
79  %IF %_handleError(&l_macname.
80  ,NoTestDB
81  ,NOT %sysfunc(exist(target.tsu)) OR NOT %symexist(g_project)
82  ,%nrstr(test database cannot be accessed, call %initSASUnit before %runSASUnit)
83  ,i_verbose=&g_verbose.
84  )
85  %THEN %GOTO errexit;
86 
87  /*-- parameter i_recursive ---------------------------------------------------*/
88  %IF "&i_recursive" NE "1" %THEN %LET i_recursive=0;
89 
90  /*-- find out all test scenarios ---------------------------------------------*/
91  %LET l_source = %_abspath(&g_root, &i_source);
92  %_dir(i_path=&l_source, i_recursive=&i_recursive, o_out=&d_dir)
93  %IF %_handleError(&l_macname.
94  ,NoSourceFiles
95  ,%_nobs(&d_dir) EQ 0
96  ,Error in parameter i_source: no test scenarios found
97  ,i_verbose=&g_verbose.
98  )
99  %THEN %GOTO errexit;
100 
101  %DO i=1 %TO %_nobs(&d_dir);
102  %LOCAL
103  l_scnfile&i
104  l_scnchanged&i
105  ;
106  %END;
107 
108  DATA _null_;
109  SET &d_dir;
110  CALL symput ('l_scnfile' !! left(put(_n_,8.)), trim(filename));
111  CALL symput ('l_scnchanged' !! left(put(_n_,8.)), compress(put(changed,12.)));
112  CALL symput ('l_nscn', compress(put(_n_,8.)));
113  RUN;
114 
115  /*-- find out all possible units under test ----------------------------------*/
116  %LET l_auto=&g_sasautos;
117  %LET l_autonr=0;
118  %DO %WHILE("&l_auto" ne "");
119  %LET l_auto=%quote(&l_auto/);
120  %_dir(i_path=&l_auto.*.sas, o_out=&d_dir)
121  data &d_examinee;
122  set %IF &l_autonr>0 %THEN &d_examinee; &d_dir(in=indir);
123  if indir then auton=&l_autonr.+2;
124  run;
125  %LET l_autonr = %eval(&l_autonr+1);
126  %LET l_auto=;
127  %IF %symexist(g_sasautos&l_autonr) %THEN %LET l_auto=&&g_sasautos&l_autonr;
128  %END;
129  %LET l_auto=&g_sasunit;
130  %LET l_auto=%quote(&l_auto/);
131  %_dir(i_path=&l_auto.*.sas, o_out=&d_dir)
132  data &d_examinee;
133  set &d_examinee &d_dir(in=indir);
134  if indir then auton=0;
135  run;
136  %LET l_auto=&g_sasunit_os;
137  %LET l_auto=%quote(&l_auto/);
138  %_dir(i_path=&l_auto.*.sas, o_out=&d_dir)
139  data &d_examinee;
140  set &d_examinee &d_dir(in=indir);
141  if indir then auton=1;
142  run;
143 
144  /*-- loop over all test scenarios --------------------------------------------*/
145  %DO i=1 %TO &l_nscn;
146 
147  %LET l_scn = %_stdPath(&g_root, &&l_scnfile&i);
148 
149  /* check if test scenario must be run */
150  %_checkScenario(
151  i_scnfile = &&l_scnfile&i
152  ,i_changed = &&l_scnchanged&i
153  ,i_dir = &d_examinee
154  ,r_scnid = l_scnid
155  ,r_run = l_dorun
156  )
157 
158  /*-- if scenario not present in test database: create new scenario --------*/
159  %IF &l_scnid = 0 %THEN %DO;
160  PROC SQL NOPRINT;
161  SELECT max(scn_id) INTO :l_scnid FROM target.scn;
162  %IF &l_scnid=. %THEN %LET l_scnid=0;
163  %LET l_scnid = %eval(&l_scnid+1);
164  INSERT INTO target.scn VALUES (
165  &l_scnid
166  ,"&l_scn"
167  ,"",.,.,.,.,.,.
168  );
169  QUIT;
170  %END;
171  /*-- if scenario already exists and has been changed: delete scenario -----*/
172  %ELSE %IF &l_dorun %THEN %DO;
173  /*-- delete corresponding files -----*/
174  %_deletescenariofiles(i_scnid=&l_scnid.);
175 
176  PROC SQL NOPRINT;
177  DELETE FROM target.cas WHERE cas_scnid = &l_scnid;
178  DELETE FROM target.tst WHERE tst_scnid = &l_scnid;
179  QUIT;
180 
181  %END;
182 
183 
184  %IF &l_dorun %THEN %DO;
185  %PUT ======== test scenario &l_scnid (&l_scn) will be run ========;
186  %PUT;
187  %PUT;
188  %END;
189  %ELSE %DO;
190  %PUT ======== test scenario &l_scnid (&l_scn) will not be run ==;
191  %PUT;
192  %PUT;
193  %END;
194 
195  /*-- start test scenario if necessary -------------------------------------*/
196  %IF &l_dorun %THEN %DO;
197 
198  /*-- save description and start date and time of scenario --------------*/
199  %_getPgmDesc (i_pgmfile=&&l_scnfile&i, r_desc=l_scndesc)
200  PROC SQL NOPRINT;
201  UPDATE target.scn SET
202  scn_desc = "&l_scndesc"
203  ,scn_start = %sysfunc(datetime())
204  WHERE scn_id = &l_scnid
205  ;
206  QUIT;
207 
208  %LET l_c_scnid = %substr(00&l_scnid.,%length(&l_scnid));
209  %LET l_scnlogfullpath = &g_log/&l_c_scnid..log;
210  %_runProgramSpawned(i_program =&&l_scnfile&i
211  ,i_scnid =&l_c_scnid.
212  ,i_generateMcoverage=&g_testcoverage.
213  ,r_sysrc =l_sysrc
214  );
215 
216  /*-- delete listing if empty -------------------------------------------*/
217  %LET l_filled=0;
218  %LET l_lstfile=&g_testout/%substr(00&l_scnid,%length(&l_scnid)).lst;
219  %IF %SYSFUNC(FILEEXIST("&l_lstfile")) %THEN %DO;
220  DATA _null_;
221  INFILE "&l_lstfile";
222  INPUT;
223  CALL symput ('l_filled','1');
224  STOP;
225  RUN;
226  %END;
227  %IF NOT &l_filled %THEN %DO;
228  %LET l_filled=%_delfile(&l_lstfile);
229  %END;
230 
231  /*-- save metadata of test scenario ------------------------------------*/
232  /* scan log for errors outside test cases */
233  %_checklog (
234  i_logfile = &l_scnlogfullpath.
235  ,i_error = &g_error.
236  ,i_warning = &g_warning.
237  ,r_errors = l_error_count
238  ,r_warnings= l_warning_count
239  )
240 
241  PROC SQL NOPRINT;
242  /* determine results of the test cases */
243  %*** Treat missing scenario as error ***;
244  %let l_result=2;
245 
246  SELECT max (cas_res) INTO :l_result FROM target.cas WHERE cas_scnid=&l_scnid;
247 
248  %*** Treat missing scenario as failed and treat scenario wit errors in scenario log as failed ***;
249  %if (&l_result. = . or &l_error_count. > 0) %then %let l_result=2;
250 
251  UPDATE target.scn
252  SET
253  scn_end = %sysfunc(datetime())
254  ,scn_rc = &l_sysrc.
255  ,scn_errorcount = &l_error_count.
256  ,scn_warningcount = &l_warning_count.
257  ,scn_res = &l_result.
258  WHERE
259  scn_id = &l_scnid.
260  ;
261  QUIT;
262 
263  %END; /* run scenario */
264  %END; /* loop for all scenarios */
265 
266  %GOTO exit;
267 %errexit:
268  %PUT;
269  %PUT =========================== Error! runSASUnit aborted! ==========================================;
270  %PUT;
271  %PUT;
272 
273  %IF %EVAL("%UPCASE(&g_error_code.)" EQ "%UPCASE(NoSourceFiles)") %THEN %DO;
274 
275  /* ensure that dummy entry for inexisting scenario is present in test database, to be able to report it later
276  */
277  %LET l_scn = %_stdPath(&g_root., &l_source.);
278 
279  %LET l_nscncount = 0;
280  PROC SQL NOPRINT;
281  SELECT Count(scn_id)
282  INTO :l_nscncount SEPARATED BY ''
283  FROM target.scn
284  WHERE Upcase(scn_path) = "%UPCASE(&l_scn.)";
285  QUIT;
286 
287  %IF %EVAL(&l_nscncount. EQ 0) %THEN %DO;
288 
289  %LET l_scndesc = %STR(Scenario not found - has to fail!);
290 
291  PROC SQL NOPRINT;
292  SELECT max(scn_id) INTO :l_scnid FROM target.scn;
293  %IF &l_scnid=. %THEN %LET l_scnid=0;
294  %LET l_scnid = %eval(&l_scnid+1);
295  INSERT INTO target.scn
296  (
297  scn_id
298  ,scn_path
299  ,scn_desc
300  ,scn_start
301  ,scn_end
302  ,scn_rc
303  ,scn_errorcount
304  ,scn_warningcount
305  ,scn_res
306  )
307  VALUES
308  (
309  &l_scnid
310  ,"&l_scn."
311  ,"&l_scndesc."
312  ,.
313  ,.
314  ,.
315  ,.
316  ,.
317  ,2
318  )
319  ;
320  QUIT;
321 
322  %END; /* if scenario is not present in database */
323 
324  %END;
325 
326 %exit:
327  PROC DATASETS NOLIST NOWARN LIB=%scan(&d_dir,1,.);
328  DELETE %scan(&d_dir,2,.);
329  DELETE %scan(&d_examinee,2,.);
330  QUIT;
331 %MEND runSASUnit;