使用 Progress 4GL 或 WebSpeed实现断言的最佳方式是什么?
4 回答
经过一番考虑,这里是我对问题的解决方案。它的工作基于以下假设:开发环境 propath 不同于测试和生产环境,并且始终重新编译代码以供测试或生产使用:
&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 }。
由于 Progress 没有对断言的本地处理,但我想出的最好的方法是:
IF NOT <assertion> THEN
RUN assertionFailed.p.
assertionFailed.p 可以给程序员发电子邮件,或者记录条件并优雅地退出。
鉴于断言通常从最终代码中省略,我建议使用预处理器路线。您可能会执行以下操作,将其设置为两个包含文件。当您将其编译到生产环境时,请确保 debugalert.i 为空。assert.i 可以被编辑来做任何你喜欢的消息,停止,电子邮件等......
要设置断言,您只需遵循格式 {assert.i &condition=}
/* assert.i */ {debugalert.i}
&IF 定义(调试) <> 0 &THEN
如果不是 {&CONDITION} 则执行:
MESSAGE THIS-PROCEDURE:FILENAME "ERROR...{&CONDITION}"
VIEW-AS ALERT-BOX.
/* add code to email message etc.. or stop */
结尾。
&万一
/* debugalert.i 在测试或开发环境中关闭断言删除此语句 */
全局定义调试器(&G)
/* 在您的测试代码中,您只需执行以下操作://测试断言 */
DEF VAR h_ct AS INT NO-UNDO INIT 10。
{assert.i &CONDITION="h_ct = 8"}
OpenEdge 11.6 将单元测试引入了 ABL 世界。它松散地基于 JUnit 原则。因此,断言现在是包的一部分。更多信息在文档中:https ://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/pdsoe/overview-of-ablunit-testing-framework.html