четверг, 7 ноября 2013 г.

GUI-тестирование "по-русски". Скажем так. "Анонс существующих возможностей" №3

Вот тут - http://18delphi.blogspot.ru/2013/11/gui-2_7.html я писал про WORDWORKER, WORDWORKERFUNCTION и слова "между" и "строго между".

Но я ещё обещал рассказать про логические операторы.

Сейчас расскажу.

Итак.

У нас было слово "между".

Выглядело оно вот так:

BOOLEAN WORDWORKERFUNCTION между INTEGER IN anX
 INTEGER VAR "Нижняя граница"
 INTEGER VAR "Верхняя граница"
 WordToWork // - слово справа, а на самом деле может быть "последовательность слов", за счёт оператора "скобки" (о нём я расскажу позже)
 DO // - вычисляем переданное слово
 =: "Верхняя граница" // - снимаем со стека верхнюю границу
 =: "Нижняя граница" // - снимаем со стека нижнюю границу
 anX "Нижняя граница" >= IF (
  X "Нижняя граница" <= IF
   true =: Result
  ELSE
   false =: Result
 )
 ELSE
  false =: Result
END //между

Два вложенных IF. Нормально.

Но как же логические операторы?

Они у нас есть.

На "хардкорном" уровне их использование выглядит так:

BOOLEAN WORDWORKERFUNCTION между INTEGER IN anX
 INTEGER VAR "Нижняя граница"
 INTEGER VAR "Верхняя граница"
 WordToWork // - слово справа, а на самом деле может быть "последовательность слов", за счёт оператора "скобки" (о нём я расскажу позже)
 DO // - вычисляем переданное слово
 =: "Верхняя граница" // - снимаем со стека верхнюю границу
 =: "Нижняя граница" // - снимаем со стека нижнюю границу
 anX "Нижняя граница" >= 
 anX "Верхняя граница" <= && IF
  true =: Result
 ELSE
  false =: Result
END //между

От одного IF - избавились.

Но по-моему - всё равно - "ужасно".

Обратная польская запись.

Будем исправлять ситуацию.

Введём слово:

BOOLEAN WORDWORKERFUNCTION И BOOLEAN IN aLeft
 aLeft IF
  WordToWork DO IF
   true =: Result
  ELSE
   false =: Result
 ELSE
  false =: Result
END // И

Мы ввели оператор "И" - мало того, что он ИНФИКСНЫЙ, так он ещё и ЛЕНИВЫЙ.

Т.е. он может не вычислять ВСЁ ВЫРАЖЕНИЕ, если уже понятен результат.

Тогда наш пример переписывается так:

BOOLEAN WORDWORKERFUNCTION между INTEGER IN anX
 INTEGER VAR "Нижняя граница"
 INTEGER VAR "Верхняя граница"
 WordToWork // - слово справа, а на самом деле может быть "последовательность слов", за счёт оператора "скобки" (о нём я расскажу позже)
 DO // - вычисляем переданное слово
 =: "Верхняя граница" // - снимаем со стека верхнюю границу
 =: "Нижняя граница" // - снимаем со стека нижнюю границу
 ( anX "Нижняя граница" >= ) И ( anX "Верхняя граница" <= ) IF
  true =: Result
 ELSE
  false =: Result
END //между

Поработаем ещё.

Введём слова:

BOOLEAN WORDWORKERFUNCTION "меньше или равно" INTEGER IN aLeft
 aLeft WordToWork DO <= =: Result
END // "меньше или равно"

BOOLEAN WORDWORKERFUNCTION "больше или равно" INTEGER IN aLeft
 aLeft WordToWork DO >= =: Result
END // "больше или равно"

Тогда наш пример можно переписать вот так:

BOOLEAN WORDWORKERFUNCTION между INTEGER IN anX
 INTEGER VAR "Нижняя граница"
 INTEGER VAR "Верхняя граница"
 WordToWork // - слово справа, а на самом деле может быть "последовательность слов", за счёт оператора "скобки" (о нём я расскажу позже)
 DO // - вычисляем переданное слово
 =: "Верхняя граница" // - снимаем со стека верхнюю границу
 =: "Нижняя граница" // - снимаем со стека нижнюю границу
 ( anX "больше или равно" "Нижняя граница" ) И ( anX "меньше или равно" "Верхняя граница" ) IF
  true =: Result
 ELSE
  false =: Result
END // между

Ну или в конечном итоге:

BOOLEAN WORDWORKERFUNCTION между INTEGER IN anX
 INTEGER VAR "Нижняя граница"
 INTEGER VAR "Верхняя граница"
 WordToWork // - слово справа, а на самом деле может быть "последовательность слов", за счёт оператора "скобки" (о нём я расскажу позже)
 DO // - вычисляем переданное слово
 =: "Верхняя граница" // - снимаем со стека верхнюю границу
 =: "Нижняя граница" // - снимаем со стека нижнюю границу
 ( anX "больше или равно" "Нижняя граница" ) И ( anX "меньше или равно" "Верхняя граница" ) =: Result
END // между

Оператор IF - нам стал НЕ НУЖЕН. Он - "скрыт" во вспомогательных словах.

Аналогично:

BOOLEAN WORDWORKERFUNCTION меньше INTEGER IN aLeft
 aLeft WordToWork DO < =: Result
END // меньше 

BOOLEAN WORDWORKERFUNCTION больше INTEGER IN aLeft
 aLeft WordToWork DO > =: Result
END // больше 

И:

BOOLEAN WORDWORKERFUNCTION "строго между" INTEGER IN anX
 INTEGER VAR "Нижняя граница"
 INTEGER VAR "Верхняя граница"
 WordToWork // - слово справа, а на самом деле может быть "последовательность слов", за счёт оператора "скобки" (о нём я расскажу позже)
 DO // - вычисляем переданное слово
 =: "Верхняя граница" // - снимаем со стека верхнюю границу
 =: "Нижняя граница" // - снимаем со стека нижнюю границу
 ( anX больше "Нижняя граница" ) И ( anX меньше "Верхняя граница" ) =: Result
END // "строго между"

Вот как-то так...

Понятное дело, что всё это относится и к операторам || и != и т.п. и т.п.

Позже - я ОБЯЗАТЕЛЬНО расскажу - "как это устроено внутри".

P.S. Хочу ещё "краем коснуться" вот этого - "Оператор IF - нам стал НЕ НУЖЕН. Он - "скрыт" во вспомогательных словах." - это - ВАЖНО. По моему ГЛУБОКОМУ убеждению - высокоуровневые тесты - ДОЛЖНЫ быть избавлены от управляющих конструкций типа IF, WHILE, LOOP, TRY и т.д. и т.п.

Они должны представлять собой лишь НАБОР ПОСЛЕДОВАТЕЛЬНЫХ действий. Которые либо проходят, либо - не проходят.

Это - ВАЖНО. НА САМОМ деле - ВАЖНО.

А управляющие конструкции ДОЛЖНЫ БЫТЬ "упакованы" во "вспомогательные слова" словарей.

Ещё раз. ЭТО - ВАЖНО.

Для того, чтобы тесты были понятны и ДЕТЕРМИНИРОВАНЫ.

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

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