在Progress 4GL中实现断言

时间:2009-05-01 12:45:09

标签: assertions progress-4gl webspeed

使用Progress 4GL或WebSpeed实现assertions的最佳方法是什么?

4 个答案:

答案 0 :(得分:4)

经过一番考虑,这是我解决问题的方法。它的工作原理是开发环境预测与测试和生产环境不同,并且代码总是被重新编译以供测试或生产使用:

&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

该代码旨在避免任何副作用,并且在任何执行环境(GUI或ChUI,WebSpeed,AppServer,批处理等)中都能正常工作。

1)将代码保存为名为“assert”的文件(不带任何扩展名)。

2)将文件放入PROPATH指向的目录。

3)样本用法:

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

作为一种变体,通过在测试和生产环境中只有一个空的包含文件,可以避免完全依赖于propath,开发版本将变为:

&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).

另一个提示是将自动文本宏添加到您选择的编辑器中,该宏将自动扩展为{assert}。

答案 1 :(得分:1)

由于Progress没有对断言进行本机处理,但最好的我想出的是:

IF NOT <assertion> THEN
RUN assertionFailed.p.

assertionFailed.p可以给程序员发送电子邮件,或者记录条件并正常退出。

答案 2 :(得分:1)

鉴于断言通常从最终代码中省略,我建议预处理器路由。您可能会执行以下操作,将其设置为两个包含文件。当您将其编译为生产时,请确保debugalert.i为空。 assert.i可以编辑,做任何你喜欢的消息,停止,发送电子邮件等...

要设置断言,您只需遵循格式{assert.i&amp; condition =}


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

&amp; IF DEFINED(DEBUGALERT)&lt;&gt; 0&amp; THEN

如果不是{&amp; CONDITION} 那么:

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

END。

&安培; ENDIF


测试或开发环境中的

/ * debugalert.i    关闭断言删除此声明* /

&amp; GLOBAL-DEFINE DEBUGALERT


/ *在您的测试代码中,您只需执行以下操作: / / 测试断言* /

DEF VAR h_ct AS INT NO-UNDO INIT 10。

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

答案 3 :(得分:0)

OpenEdge 11.6将单元测试引入了ABL领域。它宽松地基于JUnit主体。因此,断言现在是程序包的一部分。有关更多信息,请参见文档:https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/pdsoe/overview-of-ablunit-testing-framework.html