Реализация утверждений в Progress 4GL - PullRequest
3 голосов
/ 01 мая 2009

Каков наилучший способ реализации утверждений с использованием Progress 4GL или WebSpeed?

Ответы [ 4 ]

4 голосов
/ 07 мая 2009

После некоторого рассмотрения вот мое решение проблемы. Он работает исходя из предположения, что среда разработки 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}.

1 голос
/ 05 мая 2009

Учитывая, что утверждения, как правило, исключаются из окончательного кода, я бы предложил маршрут препроцессора. Вы можете сделать что-то вроде следующего, настроить его как два включаемых файла. При компиляции в производство убедитесь, что файл debugalert.i пуст. assert.i может быть отредактирован так, чтобы делать все, что угодно: сообщение, остановка, электронная почта и т. д.

Чтобы установить утверждение, вы просто должны следовать формату {assert.i & condition =}


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

& ЕСЛИ ОПРЕДЕЛЕНО (ДЕБАГАЛЕРТ) <> 0 & ТО

ЕСЛИ НЕ {И СОСТОЯНИЕ} ТО ДЕЛАЕТ:

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

END.

& ENDIF


/ * debugalert.i в средах тестирования или разработки чтобы отключить утверждения, удалите это утверждение * /

& GLOBAL-DEFINE DEBUGALERT


/ * В вашем тестовом коде вы просто сделаете следующее: / / проверка утверждения * /

DEF VAR h_ct как INT NO-UNDO INIT 10.

{assert.i & CONDITION = "h_ct = 8"}

1 голос
/ 05 мая 2009

Поскольку у Progress нет встроенной обработки утверждений, но лучше всего я придумал:

IF NOT <assertion> THEN
RUN assertionFailed.p.

assertionFailed.p может отправить электронное письмо программисту или зарегистрировать условия, а также выйти из программы.

0 голосов
/ 27 сентября 2018

OpenEdge 11.6 представил модульное тестирование в мире ABL. Это свободно основано на принципах JUnit. Поэтому утверждения теперь являются частью пакета. Больше информации в документации: https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/pdsoe/overview-of-ablunit-testing-framework.html

...