Publié le :
Test CREATION_INTERNE

Test des macros d'exécution et de gestion de jobs SAS Viya

Ce code est également disponible en : Deutsch English Español
En attente de validation
Le script commence par créer un fichier temporaire (`testref`) contenant un programme SAS© minimaliste (`data;run; endsas;`). Ce programme est ensuite utilisé par la macro `%mv_createjob` pour définir un nouveau job dans SAS© Viya. Une fois le job créé, la macro `%mv_jobexecute` est appelée pour lancer son exécution. Le script filtre ensuite les informations d'état du job et utilise `%mv_jobwaitfor` pour attendre la fin de l'exécution du job. L'URI du log du job est extraite et utilisée par `%mv_getjoblog` pour récupérer le contenu du log. Enfin, un `DATA _NULL_` step parcourt le log récupéré pour vérifier la présence de la chaîne 'endsas;', et la macro `%mp_assert` est utilisée pour confirmer que le log a été correctement récupéré et contient le marqueur attendu, validant ainsi la capacité à récupérer les logs même pour des jobs rudimentaires. Des macros d'assertion (`%mp_assertscope`) sont utilisées pour la gestion des tests.
Analyse des données

Type : CREATION_INTERNE


Le script génère ses propres données de test : un fichier temporaire (`testref`) servant de code source pour le job, et des datasets (`work.info`, `work.jobstates`) produits par les macros SAS Viya. Le contenu du log du job est également une donnée interne générée par l'exécution du job.

1 Bloc de code
DATA STEP Data
Explication :
Ce bloc crée un fileref temporaire 'testref' et y écrit un programme SAS simple (`data;run; endsas;`). Ce programme SAS minimaliste sera ensuite utilisé comme code source pour un job SAS Viya.
Copié !
1filename testref temp;
2DATA _null_;
3 file testref;
4 put 'data;run;';
5 put 'endsas;';
6RUN;
2 Bloc de code
MACRO mv_createjob
Explication :
Appel de la macro `%mv_createjob` pour définir un nouveau job SAS Viya nommé 'testjob' à l'emplacement spécifié par la macro-variable `&mcTestAppLoc/jobs/temp`. Le code source du job est lu à partir du fileref 'testref' créé précédemment.
Copié !
1%mv_createjob(
2 path=&mcTestAppLoc/jobs/temp,
3 code=testref,
4 name=testjob
5)
3 Bloc de code
MACRO mv_jobexecute Data
Explication :
Exécute le job 'testjob' défini précédemment. Les informations détaillées de l'exécution du job (URI, statut, etc.) sont sauvegardées dans le dataset `work.info`.
Copié !
1%mv_jobexecute(
2 path=&mcTestAppLoc/jobs/temp,
3 name=testjob,
4 outds=work.info
5)
4 Bloc de code
DATA STEP
Explication :
Filtre le dataset `work.info` pour ne conserver que les observations pertinentes pour le suivi de l'état du job, spécifiquement celles où `method` est 'GET' et `rel` est 'state'. Ceci est fait en préparation de l'attente du statut final du job.
Copié !
1DATA work.info;
2 SET work.info;
3 where method='GET' and rel='state';
4RUN;
5 Bloc de code
MACRO mv_jobwaitfor Data
Explication :
Appel de la macro `%mv_jobwaitfor` pour attendre que le job, dont les informations sont contenues dans `work.info`, atteigne un état final (ALL). Le statut final détaillé est enregistré dans le dataset `work.jobstates`.
Copié !
1%mv_jobwaitfor(ALL,inds=work.info,outds=work.jobstates)
6 Bloc de code
DATA STEP
Explication :
Ce `DATA _NULL_` step lit le dataset `work.jobstates` et extrait la valeur de la variable `uri` (l'Uniform Resource Identifier du log du job) pour la stocker dans la macro-variable `uri`. Cette macro-variable est essentielle pour récupérer le log du job.
Copié !
1DATA _null_;
2 SET work.jobstates;
3 call symputx('uri',uri);
4RUN;
7 Bloc de code
MACRO mv_getjoblog
Explication :
La macro `%mp_assertscope(SNAPSHOT)` est utilisée pour capturer l'état actuel des macro-variables, utile pour les comparaisons de tests. Ensuite, la macro `%mv_getjoblog` est appelée pour récupérer le log du job en utilisant l'URI extraite précédemment. Le contenu du log est sauvegardé dans le fileref `mylog` avec un débogage activé (`mdebug=1`).
Copié !
1%mp_assertscope(SNAPSHOT)
2%mv_getjoblog(uri=%str(&uri),outref=mylog,mdebug=1)
8 Bloc de code
MACRO mp_assertscope
Explication :
Cette macro `%mp_assertscope(COMPARE...)` est utilisée dans le cadre d'un test unitaire pour comparer l'état actuel des macro-variables avec un 'snapshot' précédent, en ignorant certaines macro-variables (`MCLIB2_JADP2LEN`, `MCLIB2_JADPNUM`, `MCLIB2_JADVLEN`) qui sont probablement des variables internes générées automatiquement et non pertinentes pour l'assertion.
Copié !
1/* ignore auto proc json vars */
2%mp_assertscope(COMPARE
3 ,ignorelist=MCLIB2_JADP2LEN MCLIB2_JADPNUM MCLIB2_JADVLEN
4)
9 Bloc de code
DATA STEP
Explication :
Ce `DATA _NULL_` step lit le contenu du log du job (`mylog`) ligne par ligne. Il recherche la chaîne 'endsas;'. Si elle est trouvée, la macro-variable `found` est mise à 1. Si la fin du fichier est atteinte sans trouver la chaîne, `found` est mise à 0. Le contenu du log est également écrit dans le log SAS courant via `putlog _infile_` pour faciliter le débogage.
Copié !
1DATA _null_;
2 INFILE mylog END=eof;
3 INPUT;
4 putlog _infile_;
5 retain found 0;
6 IF index(_infile_,'endsas;') THEN DO;
7 found=1;
8 call symputx('found',found);
9 END;
10 ELSE IF eof and found ne 1 THEN call symputx('found',0);
11RUN;
10 Bloc de code
MACRO mp_assert
Explication :
La macro `%mp_assert` est utilisée pour vérifier une condition de test. Ici, elle vérifie si la macro-variable `found` est égale à 1, ce qui confirme que la chaîne 'endsas;' a été trouvée dans le log du job. La description du test indique qu'il s'agit de vérifier si le log a été correctement récupéré malgré la simplicité du job soumis.
Copié !
1%mp_assert(
2 iftrue=(%str(&found)=1),
3 desc=Check IF the log was still fetched even though endsas was submitted
4)
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.