質問

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top