Erweiterung von SASunit
Verfasst von M. Christian am 26 Juni, 2008 - 14:22
Hallo! Hat schonmal jemand probiert SASunit um eigene Assertions zu erweitern? Gibt es dafür vielleicht ein kurzes HowTo? Was muss eine neue Assertion alles implementieren? Wo muss ich Sie im Gesamtsystem einbauen?
Grüße, Martin!
»
- Anmelden oder Registrieren um Kommentare zu schreiben

neue Assertions
Dafür gibt es derzeit noch keine Dokumentation. Im Wesentlichen muss das neue Assert-Makro sowie dessen Reportgenerator implementiert werden. Je nach Art des Asserts wird das Assert-Makro noch Testergebnisse in der Testdatenbank ablegen, die dann vom Reportgenerator implementiert werden.
Um welcher Art Assertions geht es denn? Haben Sie schon Erfahrungen mit SASUnit gesammelt - eine ganze Reihe von Assertions gibt es ja schon?
Neue Assertions
Hallo Herr Mangold! Momentan bin ich am Evaluieren, ob SASunit in einem Projekt bei uns eingesetzt werden kann. Wir bräuchten dazu aber neue Assertions, wie z. B. eine Prüfung ob Werte in ihrem Wertebereich liegen. Die Frage ist nun eben wieviel Aufwand es wäre, so eine Assertion zu implementieren?
Kuranleitung
Ich habe eine Kurzanleitung erstellt.
An Feedback zu sasunit allgemein bin ich sehr interessiert. Ebenso zu Ihren Erfahrungen bei dessen Erweiterung.
assertLimits
Hallo Herr Mangold,
hier ist eine erste Erweitung von SASunit um eine Prüfung der Wertebereiche:
\ingroup SASUNIT_ASSERT
\brief Prüfen, ob die Werte einer Spalte innerhalb des
Wertebereichs liegen.
\version 0.1: Initial erstellt
\author Martin Christian
\date 30.06.2008
\param i_data Eingabedatei
\param i_lowerLimit Untergrenze
\param i_upperLimit Obergrenze
\param i_var Variablenname
\param i_desc Beschreibung der Prüfung
*/ /** \cond */
%macro assertLimits (
i_data=,
i_lowerLimit=,
i_upperLimit=,
i_var=,
i_desc=
);
%global g_inTestcase;
%if &g_inTestcase EQ 1 %THEN %DO;
%endTestcall()
%end;
%else %if &g_inTestcase NE 2 %then %do;
%put &g_error: assert muss nach initTestcase aufgerufen werden;
%return;
%end;
%local l_bmimin;
%local l_bmimax;
%local l_res;
%let l_res = 1;
proc sql noprint;
select min(&i_var.), max(&i_var.)
into :l_bmimin, :l_bmimax
from &i_data.;
quit;
%if &l_bmimin. < &i_lowerLimit. %then
%let l_res = 0;
%if &l_bmimax. > &i_upperLimit. %then
%let l_res = 0;
%_sasunit_asserts(
i_type = assertLimits,
i_data = &i_data,
i_lowerLimit = &i_lowerLimit,
i_upperLimit = &i_upperLimit,
i_var = &i_var,
i_desc = &i_desc,
i_result = &l_res
)
%mend assertLimits;
/** \endcond */
Leider funktioniert es aber noch nicht so wie es soll. Es wird zwar kein Fehler ausgegeben, aber im Testreport taucht meine Assertion auch nicht auf. Muss ich sie noch irgendwo in SASunit referenzieren? Oder muss ich die Ergebnisse explizit in die Testdatenbank schreiben? Ich habe mich bei diesem Beispiel jetzt an assertEquals orientiert. Dort ist ein explizites Schreiben der Ergebnisse nicht notwendig. Was fehlt bei mir noch?
Wenn die Assertion dann funktioniert, werde ich sie mit einem Header versehen und Ihnen zur Integration in SASunit unter GPL bereitstellen.
Grüße,
Martin Christian.
was zu tun bleibt
Der Wert von l_res muss umgekehrt zugewiesen werden (0..OK, 1..Fehler).
Bitte schauen Sie sich dann die Signatur von %_sasunit_asserts an:
i_type =
,i_expected =
,i_actual =
,i_desc =
,i_result =
,r_casid =
,r_tstid =
);
i_type bis i_result müssen angegeben werden, die beiden letzten Parameter brauchen Sie wahrscheinlich nicht. Sie können nur diese im vordefinierten Makro festgelegten Parameter verwenden und müssen die Informationen, die später im Report erscheinen sollen, in i_actual und i_expected verpacken. Dazu müssen Sie sich zunächst klar machen, wie der Report für assertLimits aussehen soll. Ich würde folgendes empfehlen: die Einzelwerte der Datei nicht in den Report aufnehmen (im Gegensatz beispielsweise zu assertColumns), weil es dann ziemlich kompliziert wird, siehe meine Kurzanleitung. Stattdessen würde ich empfehlen, in i_expected als String einfach den Variablennamen und die Limits einzutragen und in i_actual den minimalen und maximalen Wert. Die Frage ist dann noch, was man macht, wenn Datei und / oder Variable nicht da sind, das sind dann Spezialfälle, die man auch entsprechend behandeln sollte.
Wichtig ist noch das Debugging Ihres neuen Asserts: Ich nehme an, Sie haben auch ein entsprechendes Testszenario geschrieben mit Beispieldaten. Wenn sasunit dann gelaufen ist und Ihr neuer Testfall noch nicht im Testreport erscheint, schauen Sie erstmal in den Log des Testszenarios. Der steht in der Spalte "letzter Lauf" auf dem Reiter "Szenarien" bei Ihrem selbstdefinieren Szenario. Dort müssten bei Ihnen beispielsweise noch Fehler drin sein, weil der Aufruf von %_sasunit_asserts nicht korrekt ist.