Domanda

Qual è il modo migliore per implementare asserzioni utilizzando Progress 4GL o WebSpeed?

È stato utile?

Soluzione

Dopo alcune considerazioni ecco la mia soluzione al problema. Funziona in base al presupposto che l'ambiente di sviluppo propath sia diverso dagli ambienti di test e di produzione e che il codice sia sempre ricompilato per l'uso di test o produzione:

&IF PROPATH MATCHES '*development*' &THEN 
&SCOPED-DEFINE ASSERTION   {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} ~
{11} {12} {13} {14} {15} {16} {17} {18} {19} {20} ~
{21} {22} {23} {24} {25} {26} {27} {28} {29} {30} ~
{31} {32} {33} {34} {35} {36} {37} {38} {39} {40} ~
{41} {42} {43} {44} {45} {46} {47} {48} {49} {50} ~
{51} {52} {53} {54} {55} {56} {57} {58} {59} {60} ~
{61} {62} {63} {64} {65} {66} {67} {68} {69} {70} ~
{71} {72} {73} {74} {75} {76} {77} {78} {79} {80} 


 IF NOT ({&ASSERTION}) THEN 
     MESSAGE "Failed assertion {&ASSERTION} in" PROGRAM-NAME(1).

 IF ({&ASSERTION}) = ? THEN 
     MESSAGE "Unknown value as a result of assertion {&ASSERTION} in" 
              PROGRAM-NAME(1).

&ENDIF

Il codice è progettato per evitare effetti collaterali e funziona ugualmente bene in qualsiasi ambiente di esecuzione (GUI o ChUI, WebSpeed, AppServer, batch e così via).

1) Salva il codice come file chiamato & # 8220; assert & # 8221; (senza alcuna estensione).

2) Posiziona il file in una directory indicata da PROPATH.

3) Utilizzo del campione:

{assert valid-handle(hProc)}
{assert i > 0 and i <= 100}
{assert cExtra begins ‘opt’}  /* note the single quotes */
{assert dtEnd > = dtStart}

Come variante & # 8217; s è possibile evitare di fare affidamento su propath del tutto avendo solo un file include vuoto nell'ambiente di test e di produzione, la versione di sviluppo diventerà semplicemente:

&SCOPED-DEFINE ASSERTION   {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} ~
{11} {12} {13} {14} {15} {16} {17} {18} {19} {20} ~
{21} {22} {23} {24} {25} {26} {27} {28} {29} {30} ~
{31} {32} {33} {34} {35} {36} {37} {38} {39} {40} ~
{41} {42} {43} {44} {45} {46} {47} {48} {49} {50} ~
{51} {52} {53} {54} {55} {56} {57} {58} {59} {60} ~
{61} {62} {63} {64} {65} {66} {67} {68} {69} {70} ~
{71} {72} {73} {74} {75} {76} {77} {78} {79} {80} 


 IF NOT ({&ASSERTION}) THEN 
     MESSAGE "Failed assertion {&ASSERTION} in" PROGRAM-NAME(1).

 IF ({&ASSERTION}) = ? THEN 
     MESSAGE "Unknown value as a result of assertion {&ASSERTION} in" 
              PROGRAM-NAME(1).

Un ulteriore suggerimento è aggiungere una macro di auto-testo al tuo editor preferito che si espanderà automaticamente in {assert}.

Altri suggerimenti

Dal momento che Progress non ha una gestione nativa delle asserzioni, ma la cosa migliore che ho ideato è:

IF NOT <assertion> THEN
RUN assertionFailed.p.

assertionFailed.p può inviare un'e-mail al programmatore o registrare le condizioni e anche uscire con grazia.

Dato che le asserzioni sono generalmente omesse dal codice finale, suggerirei il percorso del preprocessore. Potresti fare qualcosa come il seguente impostarlo come due file di inclusione. Quando lo si sta compilando per la produzione assicurarsi che il debugalert.i sia vuoto. assert.i potrebbe essere modificato per fare qualunque cosa ti piaccia messaggio, stop, email ecc ...

Per impostare un'asserzione segui semplicemente il formato {assert.i & amp; condition =}


/ * assert.i * / {debugalert.i}

& amp; SE DEFINED (DEBUGALERT) < > 0 & Amp; THEN

SE NON {& amp; CONDITION} POI FARE:

MESSAGE THIS-PROCEDURE:FILENAME "ERROR...{&CONDITION}" 
    VIEW-AS ALERT-BOX.
/* add code to email message etc.. or stop */

FINE.

&

amp; ENDIF


/ * debugalert.i su ambienti di test o di sviluppo    per disattivare le affermazioni, rimuovere questa dichiarazione * /

& amp; GLOBAL-DEFINE DEBUGALERT


/ * Nel tuo codice di test devi semplicemente fare quanto segue: / / asserzione di prova * /

DEF VAR h_ct AS INT NO-UNDO INIT 10.

{assert.i & amp; CONDITION = " h_ct = 8 "}

OpenEdge 11.6 ha introdotto Unit Testing nel mondo di ABL. È vagamente basato sui principi di JUnit. Le asserzioni sono quindi ora parte del pacchetto. Maggiori informazioni sono nella documentazione: https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/pdsoe/overview-of-ablunit-testing-framework.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top