Publié le :
Macro CREATION_INTERNE

Macro-utilitaire pour l'exécution de code contrôlée et le suivi de couverture

En attente de validation
Cette macro, `%ut_run`, est conçue pour encapsuler l'exécution de code SAS©, principalement dans un contexte de tests unitaires. Elle prend en paramètre une instruction SAS© (`stmt`). Par défaut, elle redirige le log SAS© vers un fichier temporaire pour empêcher l'affichage des messages `ERROR:` et `WARNING:` dans le log principal, ce qui permet de tester des scénarios où une erreur est le résultat attendu. Un paramètre `debug` permet de désactiver cette redirection pour le débogage. De plus, si la couverture de code est activée (via la variable macro `ut_cov`), la macro analyse le fichier de log généré pour trouver des marqueurs de couverture (`#cct#...#`), puis met à jour une table de statut (`_ut_cct_state`) pour suivre quelles parties du code ont été exécutées.
Analyse des données

Type : CREATION_INTERNE


Le script ne lit pas de données métier externes. Il génère un fichier de log qu'il lit ensuite lui-même (`&ut_work_dir./&ut_log_file.`). Il crée la table `cct` et lit/met à jour la table `_ut_cct_state`, qui est supposée faire partie de l'état interne du framework de test auquel cette macro appartient, et non une source de données externe.

1 Bloc de code
MACRO Data
Explication :
Ce bloc définit la macro `%ut_run`. Elle exécute du code SAS passé en paramètre (`stmt`). La gestion du log est contrôlée : `PROC PRINTTO` redirige la sortie vers un fichier pour la masquer du log principal, sauf en mode `debug`. La seconde partie, conditionnée par la variable `ut_cov`, gère la couverture de code : un `DATA STEP` lit le log temporaire pour extraire des marqueurs de couverture, `PROC SORT` dédoublonne les résultats, `PROC SQL` met à jour une table de suivi (`_ut_cct_state`), et `PROC DATASETS` nettoie la table temporaire `cct`.
Copié !
1%macro ut_run(stmt=, debug=);
2/*
3 Macro to run some SAS code in a controled environement where ERROR and WARNING are not output in the SAS log.
4 This allows to perform some tests whose result is an ERROR or a WARNING.
5 stmt: the SAS code to execute.
6 debug: any non null value enables the debug mode and so disable the SAS log redirection
7*/
8 *-- Exit IF framework state is erroneous --*;
9 %IF &ut_state. %THEN %DO;
10 %return;
11 %END;
12 
13 %IF %sysevalf(%superq(debug) =, boolean) %THEN %DO;
14 *-- This option allows to have SAS log lines up to 256 chars (the max) --*;
15 option linesize=max;
16 
17 *-- Redirect the SAS log --*;
18 PROC PRINTTO log="&ut_work_dir./&ut_log_file." new;
19 RUN;
20 %END;
21 
22 *-- Reset warning status --*;
23 %put WARNING: %str( );
24 
25 *-- Reset error status --*;
26 %put ERROR: %str( );
27 
28 %let syscc = 0;
29 
30 *-- Execute the provided SAS statement --*;
31 %unquote(&stmt.);
32 
33 %IF %sysevalf(%superq(debug) =, boolean) %THEN %DO;
34 *-- Disable SAS log redirection --*;
35 PROC PRINTTO;
36 RUN;
37 
38 *-- If code coverage is enabled --*;
39 %IF &ut_cov. %THEN %DO;
40 filename i_file "&ut_work_dir./&ut_log_file.";
41 
42 *-- Read the input file and find code coverage trackers --*;
43 DATA cct;
44 INFILE i_file;
45 
46 *-- Read the input file --*;
47 INPUT;
48 
49 *-- Identify code coverage trackers --*;
50 IF prxmatch('/#cct#\d+#/oi', _infile_) THEN DO;
51 attrib cct_id STATUS FORMAT=8.;
52 cct_id = INPUT(prxchange('s/#cct#(\d+)#/$1/oi', -1, _infile_), best.);
53 STATUS = 1;
54 OUTPUT;
55 END;
56 RUN;
57 
58 filename i_file clear;
59 
60 PROC SORT DATA=cct nodupkey; BY cct_id; RUN;
61 
62 *-- Save code coverage trackers found during that run --*;
63 PROC SQL noprint undo_policy=none;
64 create TABLE _ut_cct_state as
65 select c.cct_id,
66 c.row_no,
67 coalesce(c.STATUS, t.STATUS) as STATUS
68 
69 from _ut_cct_state c
70 
71 left join cct t
72 on t.cct_id = c.cct_id
73 
74 order BY c.cct_id
75 ;
76 QUIT;
77 
78 PROC DATASETS library=work nolist;
79 delete cct;
80 RUN; QUIT;
81 %END;
82 %END;
83%mend ut_run;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Banner
Le Conseil de l'Expert
Expert
Stéphanie
Spécialiste Machine Learning et IA.
« Au-delà de l'exécution contrôlée, la véritable intelligence de %ut_run réside dans son moteur d'analyse de couverture. En utilisant des expressions régulières (PRXMATCH) pour parser le log à la recherche de marqueurs spécifiques (#cct#), cette macro automatise la preuve d'exécution de chaque branche du code.

Cette approche permet de maintenir une table d'état (_ut_cct_state) mise à jour en temps réel. Pour un auditeur ou un responsable QA, c'est la garantie que 100% des chemins critiques ont été parcourus durant la phase de test, minimisant ainsi les risques de régression lors du passage en production »