Progress 4GLでのアサーションの実装
-
03-07-2019 - |
質問
Progress 4GLまたはWebSpeedを使用してアサーションを実装する最良の方法は何ですか?
解決
ここで少し検討した後、問題に対する私の解決策を示します。開発環境のプロパスはテストおよび本番環境とは異なり、テストまたは本番用にコードが常に再コンパイルされるという前提に基づいて機能します。
&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)<!>#8220; assert <!>#8221;というファイルとしてコードを保存します。 (拡張子なし)。
2)PROPATHが指すディレクトリにファイルを配置します。
3)使用例:
{assert valid-handle(hProc)}
{assert i > 0 and i <= 100}
{assert cExtra begins ‘opt’} /* note the single quotes */
{assert dtEnd > = dtStart}
バリエーションとして、<!>#8217;テストおよび本番環境で空のインクルードファイルのみを使用することで、プロパスに完全に依存することを回避できます。開発バージョンは次のようになります。
&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は、プログラマーに電子メールを送信するか、条件をログに記録して正常に終了することができます。
アサーションが一般に最終コードから省略されることを考えると、プリプロセッサルートをお勧めします。次のようにして、2つのインクルードファイルとして設定します。本番環境にコンパイルするときは、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。
<!> amp; ENDIF
/ *テスト環境または開発環境のdebugalert.i アサーションをオフにするには、このステートメントを削除します* /
<!> amp; GLOBAL-DEFINE DEBUGALERT
/ *テストコードでは、次のことを行うだけです。 / / アサーションのテスト* /
DEF VAR h_ct AS INT NO-UNDO INIT 10。
{assert.i <!> amp; CONDITION = <!> quot; h_ct = 8 <!> quot;}
OpenEdge 11.6は、ABLの世界に単体テストを導入しました。 JUnitプリンシパルに大まかに基づいています。したがって、アサーションはパッケージの一部になりました。詳細はドキュメントにあります: https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/pdsoe/overview-of-ablunit-testing-framework.html