runsasunit.sas

Go to the documentation of this file.
00001  
00035 /* change log
00036    02.10.2008 NA  Modified for LINUX
00037    11.08.2008 AM  Fehler bereinigt für den Fall, dass in der aufrufenden Sitzung keine config-Option angegeben ist 
00038                   und die mit getoption abgefragte config-option dann Werte (mit Klammern) enthält, 
00039                   die nicht an die gestartete SAS-Sitzung übergeben werden können
00040    27.06.2008 AM  config-option aus Aufruf ggfs. an die SAS-Sitzungen der Testszenarien weitergeben
00041    29.12.2007 AM  SASUSER nach Aufruf Testszenario wieder löschen
00042    18.12.2007 KL  Bugfixing beim Ermitteln der möglichen Prüflinge
00043    15.12.2007 AM  Logik für Überprüfung auf auszuführende Testszenarien neu implementiert (checkSzenario) 
00044 */ 
00045 
00046 %MACRO runSASUnit(
00047    i_source     =
00048   ,i_recursive  = 0
00049 );
00050 %LOCAL l_macname; %LET l_macname=&sysmacroname;
00051 %LOCAL d_dir  d_examinee l_source; 
00052 %_sasunit_tempFileName(d_dir);
00053 %_sasunit_tempFileName(d_examinee);
00054 
00055 /*-- check if testdatabase can be accessed -----------------------------------*/
00056 %IF %_sasunit_handleError(&l_macname, NoTestDB, 
00057    NOT %sysfunc(exist(target.tsu)) OR NOT %symexist(g_project), 
00058    %nrstr(test database cannot be accessed, call %initSASUnit before %runSASUnit))
00059    %THEN %GOTO errexit;
00060 
00061 /*-- parameter i_recursive ---------------------------------------------------*/
00062 %IF "&i_recursive" NE "1" %THEN %LET i_recursive=0;
00063 
00064 /*-- find out all test scenarios ---------------------------------------------*/
00065 %LET l_source = %_sasunit_abspath(&g_root, &i_source);
00066 %_sasunit_dir(i_path=&l_source, i_recursive=&i_recursive, o_out=&d_dir)
00067 %IF %_sasunit_handleError(&l_macname, NoSourceFiles, 
00068    %_sasunit_nobs(&d_dir) EQ 0, 
00069    Error in parameter i_source: no test scenarios found) 
00070    %THEN %GOTO errexit;
00071 
00072 %LOCAL l_nscn i;
00073 %DO i=1 %TO %_sasunit_nobs(&d_dir); 
00074    %LOCAL l_scnfile&i l_scnchanged&i;
00075 %END;
00076 DATA _null_;
00077    SET &d_dir;
00078    CALL symput ('l_scnfile' !! left(put(_n_,8.)), trim(filename));
00079    CALL symput ('l_scnchanged' !! left(put(_n_,8.)), compress(put(changed,12.)));
00080    CALL symput ('l_nscn', compress(put(_n_,8.)));
00081 RUN;
00082 
00083 /*-- find out all possible units under test ----------------------------------*/
00084 %LOCAL l_auto l_autonr;
00085 %LET l_auto=&g_sasautos;
00086 %LET l_autonr=0;
00087 %DO %WHILE("&l_auto" ne "");  
00088    %LET l_auto=%quote(&l_auto/);
00089    %_sasunit_dir(i_path=&l_auto.*.sas, o_out=&d_dir)
00090    data &d_examinee;
00091       set %IF &l_autonr>0 %THEN &d_examinee; &d_dir(in=indir);
00092       if indir then auton=&l_autonr;
00093    run; 
00094    %LET l_autonr = %eval(&l_autonr+1);
00095    %LET l_auto=;
00096    %IF %symexist(g_sasautos&l_autonr) %THEN %LET l_auto=&&g_sasautos&l_autonr;
00097 %END;
00098 
00099 /*-- loop over all test scenarios --------------------------------------------*/
00100 %LOCAL l_scn l_scnid l_dorun l_scndesc l_sysrc;
00101 %DO i=1 %TO &l_nscn;
00102 
00103    %LET l_scn = %_sasunit_stdPath(&g_root, &&l_scnfile&i);
00104 
00105    /* check if test scenario must be run */
00106    %_sasunit_checkScenario(
00107       i_scnfile = &&l_scnfile&i
00108      ,i_changed = &&l_scnchanged&i
00109      ,i_dir     = &d_examinee
00110      ,r_scnid   = l_scnid
00111      ,r_run     = l_dorun
00112    )
00113 
00114    /*-- if scenario not present in test database: create new scenario --------*/
00115    %IF &l_scnid = 0 %THEN %DO;
00116       PROC SQL NOPRINT;
00117          SELECT max(scn_id) INTO :l_scnid FROM target.scn;
00118          %IF &l_scnid=. %THEN %LET l_scnid=0;
00119          %LET l_scnid = %eval(&l_scnid+1);
00120          INSERT INTO target.scn VALUES (
00121              &l_scnid
00122             ,"&l_scn"
00123             ,"",.,.,.,.
00124          );
00125       QUIT;
00126    %END;
00127    /*-- if scenario already exists and has been changed: delete scenario -----*/
00128    %ELSE %IF &l_dorun %THEN %DO;
00129       PROC SQL NOPRINT;
00130          DELETE FROM target.cas WHERE cas_scnid = &l_scnid;
00131          DELETE FROM target.tst WHERE tst_scnid = &l_scnid;
00132       QUIT;
00133    %END;
00134 
00135    %IF &l_dorun %THEN %DO;
00136       %PUT ======== test scenario &l_scnid (&l_scn) will be run ========;
00137       %PUT;
00138       %PUT;
00139    %END;
00140    %ELSE %DO;
00141       %PUT ======== test scenario &l_scnid (&l_scn) will not be run ==;
00142       %PUT;
00143       %PUT;
00144    %END;
00145 
00146    /*-- start test scenario if necessary -------------------------------------*/
00147    %IF &l_dorun %THEN %DO;
00148 
00149       /*-- save description and start date and time of scenario --------------*/
00150       %_sasunit_getPgmDesc (i_pgmfile=&&l_scnfile&i, r_desc=l_scndesc)
00151       PROC SQL NOPRINT;
00152          UPDATE target.scn SET
00153             scn_desc  = "&l_scndesc"
00154            ,scn_start = %sysfunc(datetime())
00155          WHERE scn_id = &l_scnid
00156          ;
00157       QUIT;
00158  
00159       /*-- prepare sasuser ---------------------------------------------------*/
00160       DATA _null_;
00161          FILE "%sysfunc(pathname(work))/x.cmd";
00162          PUT "&g_removedir ""%sysfunc(pathname(work))/sasuser""&g_endcommand";
00163          PUT "&g_makedir ""%sysfunc(pathname(work))/sasuser""&g_endcommand";
00164       %IF %length(&g_sasuser) %THEN %DO;
00165          PUT "&g_copydir ""&g_sasuser"" ""%sysfunc(pathname(work))/sasuser""&g_endcommand";
00166       %END;
00167       RUN;
00168       %if &sysscp. = LINUX %then %do;
00169           %_sasunit_xcmd(chmod u+x "%sysfunc(pathname(work))/x.cmd")
00170       %end;
00171       %_sasunit_xcmd("%sysfunc(pathname(work))/x.cmd")
00172       %LOCAL l_rc;
00173       %LET l_rc=_sasunit_delfile(%sysfunc(pathname(work))/x.cmd);
00174          
00175       /*-- run test scenario in a new process --------------------------------*/
00176       %LOCAL l_parms l_parenthesis;
00177       %LET l_parms=;
00178       %LET l_parenthesis=(;
00179       %IF "&g_autoexec" NE "" %THEN %DO;
00180          %LET l_parms=&l_parms -autoexec "&g_autoexec";
00181       %END;
00182       %IF "&g_sascfg" NE "" %THEN %DO;
00183          %LET l_parms=&l_parms -config "&g_sascfg";
00184       %END;
00185       %ELSE %IF %length(%sysfunc(getoption(config))) NE 0 AND %index(%quote(%sysfunc(getoption(config))),%bquote(&l_parenthesis)) = 0 %THEN %DO; 
00186          %LET l_parms=&l_parms -config "%sysfunc(getoption(config))";
00187       %END; 
00188       %sysexec 
00189             &g_sasstart
00190             &l_parms
00191             -sysin "&&l_scnfile&i"
00192             -initstmt "%nrstr(%_sasunit_scenario%(io_target=)&g_target%nrstr(%)%let g_scnid=)&l_scnid;"
00193             -log   "&g_log/%substr(00&l_scnid,%length(&l_scnid)).log"
00194             -print "&g_testout/%substr(00&l_scnid,%length(&l_scnid)).lst"
00195             &g_splash
00196             -noovp
00197             -nosyntaxcheck
00198             -mautosource
00199             -mcompilenote all
00200             -sasautos "&g_sasunit"
00201             -sasuser "%sysfunc(pathname(work))/sasuser"
00202             -termstmt '%_sasunit_termScenario()'
00203          ;  
00204       %LET l_sysrc = &sysrc;
00205 
00206       /*-- delete sasuser ----------------------------------------------------*/
00207       DATA _null_;
00208          FILE "%sysfunc(pathname(work))/x.cmd";
00209          PUT "&g_removedir ""%sysfunc(pathname(work))/sasuser""&g_endcommand";
00210       RUN;
00211       %if &sysscp. = LINUX %then %do;
00212           %_sasunit_xcmd(chmod u+x "%sysfunc(pathname(work))/x.cmd")
00213       %end;
00214 
00215       %_sasunit_xcmd("%sysfunc(pathname(work))/x.cmd")
00216       %LET l_rc=_sasunit_delfile(%sysfunc(pathname(work))/x.cmd);
00217 
00218       /*-- delete listing if empty -------------------------------------------*/
00219       %LOCAL l_filled l_lstfile; 
00220       %LET l_filled=0;
00221       %LET l_lstfile=&g_testout/%substr(00&l_scnid,%length(&l_scnid)).lst;
00222       DATA _null_;
00223          INFILE "&l_lstfile";
00224          INPUT;
00225          CALL symput ('l_filled','1');
00226          STOP;
00227       RUN;
00228       %IF NOT &l_filled %THEN %DO;
00229          %LET l_filled=%_sasunit_delfile(&l_lstfile);
00230       %END;
00231 
00232       /*-- save metadata of test scenario ------------------------------------*/
00233       PROC SQL NOPRINT;
00234          %LOCAL l_result0 l_result1 l_result2;
00235          /* determine results of the test cases */
00236          SELECT count(*) INTO :l_result0 FROM target.cas WHERE cas_scnid=&l_scnid AND cas_res=0;
00237          SELECT count(*) INTO :l_result1 FROM target.cas WHERE cas_scnid=&l_scnid AND cas_res=1;
00238          SELECT count(*) INTO :l_result2 FROM target.cas WHERE cas_scnid=&l_scnid AND cas_res=2;
00239          
00240          %LOCAL l_result;
00241          %IF &l_result1 GT 0 %THEN %LET l_result=1;        /* error occured */
00242          %ELSE %IF &l_result2 GT 0 %THEN %LET l_result=2;  /* manual occured */
00243          %ELSE %LET l_result=0;                            /* everything OK */
00244 
00245          UPDATE target.scn
00246             SET 
00247                 scn_end = %sysfunc(datetime())
00248                ,scn_rc  = &l_sysrc
00249                ,scn_res = &l_result
00250             WHERE 
00251                scn_id = &l_scnid
00252             ;
00253       QUIT;
00254 
00255    %END; /* run scenario */
00256 %END; /* loop for all scenarios */
00257 
00258 %GOTO exit;
00259 %errexit:
00260    %PUT;
00261    %PUT =========================== Error! runSASUnit aborted! ==========================================;
00262    %PUT;
00263    %PUT;
00264 %exit:
00265 PROC DATASETS NOLIST NOWARN LIB=%scan(&d_dir,1,.);
00266    DELETE %scan(&d_dir,2,.);
00267    DELETE %scan(&d_examinee,2,.);
00268 QUIT;
00269 %MEND runSASUnit;

Generated on Sun Oct 10 14:10:15 2010 for SASUnit Examples by  doxygen 1.5.3