Implementação afirmações em Progress 4GL
-
03-07-2019 - |
Pergunta
Qual é a melhor forma de implementar afirmações utilizando Progress 4GL ou WebSpeed?
Solução
Depois de alguma consideração aqui é a minha solução para o problema. Ele funciona com base no pressuposto de que o ambiente de desenvolvimento PROPATH é diferente de ambientes e de código de teste e produção é sempre re-compilado para teste ou produção de utilização:
&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
O código é projetado para evitar quaisquer efeitos colaterais e funciona igualmente bem em qualquer ambiente de execução (GUI ou Chuí, WebSpeed, AppServer, lote e assim por diante).
1) Salvar o código como um arquivo chamado “assert” (sem qualquer extensão).
2) Coloque o arquivo em um diretório apontado pela PROPATH.
3) Exemplo de uso:
{assert valid-handle(hProc)}
{assert i > 0 and i <= 100}
{assert cExtra begins ‘opt’} /* note the single quotes */
{assert dtEnd > = dtStart}
Como uma variação que é possível evitar depender PROPATH por completo, tendo apenas um vazio arquivo de inclusão no ambiente de teste e produção, a versão de desenvolvimento será apenas:
&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).
Uma dica extra é adicionar uma macro automática de texto para o seu editor de escolha que irá expandir automaticamente em {assert}.
Outras dicas
Desde Progress não tem manipulação nativo para afirmações, mas o melhor que eu vim acima com é:
IF NOT <assertion> THEN
RUN assertionFailed.p.
assertionFailed.p pode enviar o programador, ou entrar as condições e também sair normalmente.
Dado que as afirmações são geralmente omitido do código final eu sugiro a rota pré-processador. Que você pode fazer algo como o seguinte configurá-lo como dois arquivos de inclusão. Quando você está compilando isto a produção garantir que o debugalert.i está vazio. assert.i poderia ser editado para fazer o que quiser mensagem, stop, e-mail etc ...
Para configurar uma afirmação você teria apenas que seguir o formato {assert.i & condição =}
/ * assert.i * / {Debugalert.i}
& se definido (DEBUGALERT) <> 0 & THEN
SE NÃO {& CONDIÇÃO} Em seguida, faça:
MESSAGE THIS-PROCEDURE:FILENAME "ERROR...{&CONDITION}"
VIEW-AS ALERT-BOX.
/* add code to email message etc.. or stop */
FIM.
& ENDIF
/ * debugalert.i em ambientes de teste ou de desenvolvimento
para desligar as afirmações remover esta declaração * /
& GLOBAL-DEFINE DEBUGALERT
/ * Em seu código de teste você teria apenas que fazer o seguinte: / / testing afirmação * /
DEF VAR h_ct AS INT NO-UNDO INIT 10.
{assert.i & condição = "h_ct = 8"}
OpenEdge 11.6 introduziu Unidade de Teste para o mundo da ABL. É vagamente baseado em princípios JUnit. Afirmações são, portanto, agora parte do pacote. Mais informações está na documentação: https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/pdsoe/overview-of-ablunit-testing-framework.html