четверг, 17 октября 2013 г.

Коротко. Тесты "по-русски"

"Внутри" тестов "по русски" лежит "ХАРДКОРНЫЙ" программистский код (на любом доступном "скриптовом" языке. Пусть даже на том же Python).

У нас это выглядит так:
: " и проверить наличие диалога с кнопкой" IN aProc INTEGER IN aButton
 aButton CASE 
  mbOk wait:Ok
  mbYes wait:Yes
  mbNo wait:No
  DEFAULT ( 'Неизвестная кнопка диалога' RAISE )
 ENDCASE 
 TRY
  aProc DO
 FINALLY
  TRY
   waited:? 'Не дождались диалога' ASSERTS
   // - убеждаемся, что диалог про конец поиска таки был
  EXCEPT
   "Сравнить текущее исключение с эталоном"
   DROP
   // - удаляем результат waited:? со стека, т.к. прилетела ересь 'Нарушен баланс скобок Wait'
   RAISE
  END 
 END
;
...
: "Встать на последнюю консультацию"
 OnTest
 cc:End
 контрол::FoldersTree:push pop:control:Caption 'Неподтвержденные' SameStr 'Не попали на папку неподтверждённых консультаций' ASSERTS
 cc:Up
 контрол::FoldersTree:push pop:control:Caption 'Ответы' SameStr
 IF
  cc:TreeExpand
  // - обрабатываем ситуацию, когда папка Отвеченные оказывается закрытой
  //   всё остальное шаманство с OnTest похоже не нужно, но пусть пока будет
 ELSE
  контрол::FoldersTree:push pop:control:Caption 'Неподтвержденные' SameStr
  IF
   cc:Up
   контрол::FoldersTree:push pop:control:Caption 'Ответы' SameStr 'Не встали на папку Ответы' ASSERTS
   cc:TreeExpand
  ELSE 
   //false контрол::FoldersTree:push pop:control:Caption ASSERTS
  ENDIF
 ENDIF 
 cc:End
 cc:Up
 // Перейти к импортированной консультации
;

: "Удалить последнюю консультацию"
 "Перевести фокус в консультации"
 OnTest
 "Встать на последнюю консультацию"
 wait:Yes
 TRY
  //cc:Del
  // - данная команда OVC на этом дереве не работает поэтому посылаем кнопку
  //   но по-хорошему вообще надо вызывать операцию сущности
  "Нажать Del"
  // - удаляем один элемент списка
 FINALLY 
  waited:? 'Не было диалога подтверждения удаления консультации' ASSERTS
  // - убеждаемся, что диалог удаления таки был
 END
;
...
: "Импортировать консультацию, проверить наличие баллона и текст консультации"

 : Действия
 
  : Действия
  
  
   : TryHarder
   
    : TryHarder1
     3 LOOP OnTest
     "Перевести фокус в консультации"
    ; // TryHarder
    
    2 LOOP TryHarder1
    3 LOOP OnTest
   ; // TryHarder 
   
   TryHarder
   
   "Нажать на медаль {("Синяя медаль о наличии консультаций")} и проверить наличие баллона"
   
   TryHarder
   
   "Встать на последнюю консультацию"
   // Перейти к импортированной консультации
   "Нажать {('Enter')}"
   // Открыть выбранную консультацию
   "Сравнить текст с эталоном"
  ;
   
  "Выполнить {(@ Действия)} с импортированой консультацией"
 ; 
 
 "Выполнить {(@ Действия)} со вкладкой консультаций"
;
...
: "Сравнить список с эталоном" OBJECT IN aList

 aList ЯВЛЯЕТСЯ class::TvtLister IF
  aList pop:control:Caption .
 ELSE
  INTEGER VAR Count
  INTEGER VAR Item
  0 >>> Item

  aList tree:GetItemsCount =: Count

  Item Count FOR
   Item aList tree:GetItem Node:Text "Заменить непечатаемые символы" .
   ++! Item
  NEXT
 ENDIF
; // "Сравнить список с эталоном"
...
BOOLEAN FUNCTION "Расширенно найти ссылку в дереве" BOOLEAN IN aProc STRING IN aContext STRING IN aControl

 false =: Result
 
 STRING VAR l_Name
 
 focused:control:push pop:component:Name =: l_Name
 l_Name РАВНО aControl 
  [[ 'Почему то в фокусе ' l_Name ' а не ' aControl ]] strings:Cat
   ASSERTS

 : "Ищем ноду по контексту" IN aProc
  INTEGER VAR "Предельное количество"
  500 >>> "Предельное количество"
 
  BOOLEAN VAR Сделано
  НЕТ >>> Сделано
 
  INTERFACE VAR l_Node
  
  VAR l_CompareOp
  контрол::tvConfs РАВНО aControl IF
   @ StartsStr =: l_CompareOp
  ELSE
   @ SameStr =: l_CompareOp
  ENDIF 
 
  TRY  
   ПОКА ( НЕ Сделано И ( "Предельное количество" >0 ) )
   BEGIN
    --! "Предельное количество"
    aControl byname:control:push tree:CurrentNode >>> l_Node
    
    STRING VAR l_Text
    l_Node Node:Text =: l_Text
    
    aContext l_Text l_CompareOp DO IF 
     ДА >>> Сделано
     true =: Result
    ELSE
 //    l_Node Node:IsLast IF 
 //     ДА >>> Сделано
 //    ELSE
 //     "Стрелка вниз"
 //    ENDIF
     // Node:IsLast - не совсем нам подходит, она говорит в РОДИТЕЛЕ, а не во ВСЁМ ДЕРЕВЕ
     TRY
      aProc DO
     EXCEPT
      // - наверное добежали до конца дерева
      ДА >>> Сделано
     END 
    ENDIF
   END
  
  FINALLY 
   nil =: l_Node
  END
 ; // "Ищем ноду по контексту"
 
 @ "Стрелка вниз" "Ищем ноду по контексту"
 
 Result IF
  aProc ? ( "Нажать {('Enter')}" )
  OnTest
 ELSE 
  контрол::tvConfs РАВНО aControl IF
  // - Заплатка для борьбы с непереключением конфигураций
   @ "Стрелка вверх" "Ищем ноду по контексту"
   Result IF
    aProc ? ( "Нажать {('Enter')}" )
    OnTest
   ENDIF //  Result IF
  ENDIF // контрол::tvConfs РАВНО aControl IF
 ENDIF // Result IF
; // "Расширенно найти ссылку в дереве"

: "Найти документ в списке" STRING IN aContext
 "Расширенно {(false)} найти ссылку {(aContext)} в дереве {(контрол::tvList)}"
; // "Найти документ в списке"

: "Найти документ в списке и открыть его" STRING IN aContext
 "Расширенно {(false)} найти ссылку {(aContext)} в дереве {(контрол::tvList)}" IF
  "Нажать {('Enter')}"
 ELSE 
  'Документ в списке не найден!' .
 ENDIF
; // "Найти документ в списке"

BOOLEAN FUNCTION "Перейти по ссылке в дереве" STRING IN aContext STRING IN aControl
 false =: Result
 "Расширенно {(true)} найти ссылку {(aContext)} в дереве {(aControl)}" IF
 true =: Result
 ENDIF
; // Перейти по ссылке в дереве"

: "Переключиться на конфигурацию" STRING IN aContext

 "Открыть список конфигураций и перевести туда фокус"
 
 "Переместиться в начало дерева"
 
 "Перейти по ссылке {(aContext)} в дереве {(контрол::tvConfs)}" ! IF
  "Открыть список конфигураций и перевести туда фокус"
  "Переместиться в начало дерева"
  "Сравнить текущий список с эталоном"
  "Закрыть список конфигураций"
  false
   [[ 'Не удалось переключить конфигурацию на :' aContext ]] strings:Cat
    ASSERTS
 ELSE
  "Закрыть список конфигураций"
  // - т.к. конфигурация могла быть активной и Enter мог не срабоать
 ENDIF // "Перейти по ссылке {(aContext)} в дереве {(aControl)}" !
 "Дождаться переключения вкладок"
; // "Переключиться на конфигурацию"

: "Поработать с расширенной конфигурацией" IN aProc
 "Переключиться на конфигурацию {('Расширенная')}"
 TRY
  aProc DO
 FINALLY
  "Открыть список конфигураций и перевести туда фокус"
  // Это для того, чтобы фокус не потерять, а то он почему-то теряется
  "Переключиться на конфигурацию {('Основная')}"
 END // TRY..FINALLY
; // "Поработать с расширенной конфигурацией"

: "Сделать в расширенной конфигурации" IN aProc
 aProc "Поработать с расширенной конфигурацией"
; // "Сделать в расширенной конфигурации"

: "Вернуться к найденному"
 "Вернуться к найденному без проверки"
 "Сравнить абзац текущего редактора с эталоном"
;

...
: "Проверка хинта для контрола" OBJECT IN aControl
 : Действия
  "Установить курсор мыши по координатам {( 5 5 )} относительно контрола {(aControl)}"
  "Дождаться переключения вкладок"
  9 раз ( "Дать системе перерисоваться" 
  100 SLEEP )
   "Узнать, виден ли хинт" IF 
    'Хинт:' . 
    "Сравнить текст хинта с эталоном"
   ELSE
    'Хинта нет.' . 
   ENDIF 
 ; // Действия

"Запомнить позицию мыши и выполнить {(@ Действия)}" 
; // "Проверка хинта для контрола"

: "Сохраняем объект в папку Мои документы с именем "  STRING IN aName
  : Действия
   "Ввести строку {(aName)}"
   OBJECT VAR "Форма сохранения в МД"
   OBJECT VAR "Кнопка ОК"
   "Контрол в фокусе" 2 раза "Получить родительскую форму" =: "Форма сохранения в МД"
   "Форма сохранения в МД" "Узнать, существует ли объект" ! 'Не нашли форму сохранения в МД' ASSERTS
   'bt_enResult_opOk' "Форма сохранения в МД" "Найти контрол по имени на форме" =: "Кнопка ОК"
   "Кнопка ОК" "Кликнуть"
  ; // Действия
 3 раза "Дождаться переключения вкладок"
 @ (  "Сохранить в Мои документы" ) MODAL ( Действия )
; // "Сохраняем объект в папку Мои документы с именем "

...

Но! ОЧЕНЬ быстро этот "ХАРДКОРНЫЙ" код начинает скрываться за "фасадом" из "русских" названий:

: K100009879

 ППР
 "Перевести фокус в поле 'Тип' в ППР"
 "Нажать {('Ctrl+Down')}"
 "Нажать {('Enter')}"
 "Выделить текст в поле"
 "Сравнить выделенный текст текущего редактора с эталоном"
;

K100009879
...
: K103940127

 INTEGER VAR l_Wnd
 "Найти окно с заголовком {('Совет дня')}" >>> l_Wnd
 ( l_Wnd "НЕ РАВНО" 0 ) ? ( l_Wnd "Закрыть окно по дескриптору из стека" )

 ППР
 "Перевести фокус в поле 'Тип' в ППР"
 "Обработать Enter модально" (
 70 раз ( "Выбрать атрибут ИЛИ"
 "Стрелка вниз" )
 "Нажать {('Enter')}" )
 "Перевести фокус в поле 'Номер' в ППР"
 "Обработать Enter модально" (
 170 раз ( "Выбрать атрибут ИЛИ"
 "Стрелка вниз" )
 "Нажать {('Enter')}" )
 "Узнать максимальное положение вертикального скроллбара у текущего редактора" .
;

K103940127
...
// Разработчик: Селянкин Владимир

: K161121041

 "Очистить журнал работы"
 "Открываем {(10003000)}"
 "Открываем {(2001)}"
 "Открываем {(2002)}"
 "Открываем {(2003)}"
 "Открываем {(2004)}"
 "Открываем {(2005)}"
 ОМ
 "Открываем {(10003000)}"
 ОМ
 "Сравнить список последних открытых документов с эталоном"
;

K161121041
...
: K167353606

 "Поиск лекарственного средства"
 "Ввести строку {('хел')}"
 "Нажать Искать"
 "Предварительный просмотр с эталонами"
;

K167353606
...
: K183337891

 "Открываем НК"
 75 раз ( "Перейти на параграф вниз" )
 "Дождаться переключения вкладок"
 СР
 "Вернуться в текст документа"
 "Выделить {(1)} параграфов"
 "Сравнить выделенный текст текущего редактора с эталоном"
;

K183337891
...
// Разработчик: Селянкин Владимир

: K200085315

 : Действия
  "Открываем {(6086112)}"
  "Предварительный просмотр"
  "Нажать {('Esc')}"
  "Выполнить {(@ NOP)} с переключённой базой"
 ;

 ТБ24
 "Выставить форме размеры {(1456 1000)} и {(@ Действия)}"
;

K200085315
...
: K200085334

 "Открываем {(2008)}"
 "Предварительный просмотр"
 "Дать системе перерисоваться"
 "Нажать {('Esc')}"
 "Выполнить {(@ "Проверить, что удалось перевести фокус в оглавление")} с переключённой базой"
;

K200085334
...
: K216794957

 ТБ24
 ППР
 "Перевести фокус в поле 'Орган/Источник' в ППР"
 "в поле 'Орган/Источник' ввести {('Правительство России и СССР')}"
 "Выделить текст в поле"
 "Начинаем набирать {('Органы')}"
 "Сравнить абзац текущего редактора с эталоном"
 "Нажать {('Enter')}"
 "Сравнить абзац текущего редактора с эталоном"
 "Нажать Искать"
 "Проверить информацию о списке"
;

K216794957
...
: K224135514

 "Копировать в буфер строку {('01.01.2010')}"
 ППР
 "Перевести фокус в поле 'Дата принятия' в ППР"
 "Вставить"
 "Выделить текст в поле"
 "Сравнить выделенный текст текущего редактора с эталоном"
;

K224135514
...
: K227478809

 ППР
 "Установить фокус в поле 'Раздел/Тема' "
 "Выбрать в дереве атрибутов контекст {('Бухгалтерский учет, аудит, статистическая отчетность')}"
 "Нажать Искать"
 "Назад по истории"
 "Установить фокус в поле 'Раздел/Тема' "
 "Добавить ещё один атрибут"
 @ ( "Нажать {('Enter')}" ) MODAL (
 "Стрелка вниз" 
 "Нажать {('Enter')}"
 "Выбрать атрибут ИЛИ" )
 "Нажать Искать"
 "Назад по истории"
 "Установить фокус в поле 'Раздел/Тема' "
 "Выделить текст в поле"
 "Сравнить выделенный текст текущего редактора с эталоном"
 "Стрелка вниз"
 "Выделить текст в поле"
 "Сравнить выделенный текст текущего редактора с эталоном"
;

K227478809
...

Комментариев нет:

Отправить комментарий