Научная статья на тему 'ОБОБЩёННЫЕ СЕМАНТИКИ ТЕСТОВОГО ВЗАИМОДЕЙСТВИЯ'

ОБОБЩёННЫЕ СЕМАНТИКИ ТЕСТОВОГО ВЗАИМОДЕЙСТВИЯ Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
133
49
i Надоели баннеры? Вы всегда можете отключить рекламу.

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Бурдонов И. Б., Косачев А. С.

В данной работе мы обобщаем семантику взаимодействия, допуская наблюдение отказов, не обязательно совпадающих с множеством разрешаемых действий (и даже не обязательно вложенных в него). Рассмотрение состоит из двух частей: сначала рассматриваются модели без приоритетов, а потом вводятся приоритеты.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «ОБОБЩёННЫЕ СЕМАНТИКИ ТЕСТОВОГО ВЗАИМОДЕЙСТВИЯ»

Обобщённые семантики тестового взаимодействия

И.Б. Бурдонов, А. С. Косачев

1. Введение

В нашей работе [4] введён класс семантик тестового взаимодействия, основанного на наблюдениях двух типов: наблюдение внешнего действия, выполняемого тестируемой системой, и наблюдение отсутствия действий из некоторого множества действий, называемое отказом. При этом тестовое воздействие сводится к разрешению системе выполнять любое действие из заданного множества действий. Предполагалось, что отказ либо не наблюдается при данном тестовом воздействии (Q-отказ), либо совпадает с множеством разрешаемых действий (R-отказ). Такая семантика называлась R/Q -семантикой и задавалась двумя семействами подмножеств алфавита внешних действий: R и Q. Подробное изложение теории конформности с доказательствами утверждений содержится в докторской диссертации И.Бурдонова [7], теория конформности для класса, так называемых ßy5-семантик излагается в нашей книге [6].

В этих работах предполагалось отсутствие приоритетов между действиями, которые тестируемая система может выполнять при данном тестовом воздействии: действие может выполняться независимо от того, какие ещё действия разрешаются тестовым воздействием. В то же время для реальных программных и аппаратных систем такая модель не всегда адекватно отражает требуемое поведение системы. В нашей статье [8] предлагается способ введения приоритетов в теорию конформности для R/Q-семантики: в модель системы, отношение конформности, методы генерации тестов и оператор композиции (сборки составной системы из взаимодействующих между собой компонентов).

В данной работе мы обобщаем семантику взаимодействия, допуская наблюдение отказов, не обязательно совпадающих с множеством разрешаемых действий (и даже не обязательно вложенных в него). Рассмотрение состоит из двух частей: сначала рассматриваются модели без приоритетов, а потом вводятся приоритеты.

2. Р-семантика без приоритетов

2.1. Формализация взаимодействия

Верификация конформности понимается как проверка соответствия исследуемой системы заданным требованиям (рис.1). В модельном мире система отображается в реализационную модель (реализацию), требования - в спецификационную модель (спецификацию), а их соответствие - в бинарное отношение конформности. Если требования выражены в терминах взаимодействия системы с окружающим миром, возможно тестирование как проверка конформности в процессе тестовых экспериментов, когда тест подменяет собой окружение системы. Для такой проверки предполагается, что реализационная модель существует (так называемая, тестовая гипотеза), хотя может быть неизвестной. В модельном мире по спецификации генерируются модельные тесты и определяется отношение «реализация проходит тест». Набор тестов полон, если реализация проходит каждый тест из набора тогда и только тогда, когда она конформна спецификации. Модельные тесты транслируются в реальные тестовые программы, которые прогоняются на тестируемой системе. Реальное отношение «проходит» должно адекватно отражаться в модельном отношении «проходит». Само отношение конформности и его тестирование (в частности, отношение «проходит») базируются на той или иной модели взаимодействия.

Реальныймир Модельный мир

Рис.1. Тестирование конформности

Мы будем рассматривать такие семантики взаимодействия, которые основаны только на внешнем, наблюдаемом поведении системы и не учитывают её внутреннее устройство, отображаемое на уровне модели в понятии состояния. В этом случае говорят о тестировании методом «чёрного ящика» или

функциональном тестировании. Мы можем наблюдать только такое поведение реализации, которое, во-первых, «спровоцировано» тестом (управление) и, во-вторых, наблюдаемо во внешнем взаимодействии. Такое взаимодействие может моделироваться с помощью так называемой машины тестирования [4,6,7,9,10,15]. Она представляет собой «чёрный ящик», внутри которого находится реализация (рис. 2). Управление сводится к тому, что оператор машины, выполняя тест (понимаемый как инструкция оператору), нажимает какие-то кнопки на клавиатуре машины, «приказывая» или «разрешая» реализации выполнять те или иные действия, которые могут им наблюдаться. Наблюдения (на «дисплее» машины) бывают двух типов: наблюдение некоторого действия, выполняемого реализацией, и наблюдение отказа как отсутствия каких бы то ни было действий из некоторого множества действий.

А, В, И, 0,...сЬ

Рис. 2. Машина тестирования

Следует подчеркнуть, что при управлении оператор разрешает реализации выполнять именно множество действий, а не обязательно одно действие. Например, при тестировании реактивных систем, основанных на обмене стимулами и реакциями, посылка одного стимула из теста в реализацию может интерпретироваться, как разрешение реализации выполнять только одно действие - приём этого стимула. Однако приём тестом ответной реакции должен означать разрешение реализации выдавать любую реакцию как раз для того, чтобы проверить, правильна эта реакция или нет. Мы будем считать, что оператор нажимает одну кнопку А, но на кнопке «написано», вообще говоря, не одно действие, а множество разрешаемых действий А. Когда происходит наблюдение (действие или отказ), кнопка автоматически отжимается, и все внешние действия считаются запрещёнными. Далее оператор может нажимать другую (или ту же самую) кнопку.

В то же время множество разрешаемых действий - это, вообще говоря, не любое подмножество множества всех внешних действий. В вопросе о том, какие множества действий могут разрешаться тестом, а какие нет, среди исследователей существует большое разнообразие точек зрения. Например, для реактивных систем обычно считается, что нельзя (или бессмысленно) смешивать посылку стимулов с приёмом реакций (Ян Тритманс). Но существует и прямо противоположный подход: нельзя «тормозить» выдачу реакций реализацией; поэтому, даже посылая стимул, тест должен быть готов к приёму любой реакции (А.Ф. Петренко).

Также следует подчеркнуть, что наблюдаться может, вообще говоря, не любой отказ. И здесь разные исследователи опираются на разные предположения. Для тех же реактивных систем долгое время считалось, что тест может наблюдать отсутствие реакций (quiescence, стационарность), например, по тайм-ауту, но не видит, принимает ли реализация посланный ей стимул или нет (input refusal, блокировка стимула). С другой стороны, в последние годы появляется всё больше и больше работ, в которых такие блокировки стимулов полностью или частично допускаются [1-6,11,12,13]. Также и реакции, если они принимаются тестом по разным «выходным каналам», можно принимать не все, а лишь те, которые относятся к одному или нескольким выбранным каналам. Эго даёт наблюдение отказа, называемого «частичной стационарностью» - отсутствие реакций из множества не всех реакций, а только тех, что относятся к данному выходному каналу [11,12].

Для наблюдения отказа нужно, чтобы оператор каким-то образом указал соответствующее множество внешних действий. В [4,6,7,8] предполагалось, что это множество совпадает с множеством разрешаемых действий: если оператор нажимает кнопку А, разрешая реализации выполнять действия из множества А, то наблюдаться может только отказ А, который означает, что реализация не может выполнить ни одно действие из А. В то же время существуют случаи, когда такого совпадения нет. Например, в реактивных системах без «торможения» реакций, когда стационарность наблюдаема, а блокировки стимулов не наблюдаемы, при посылке в реализацию стимула с одновременным приёмом всех реакций отказ может означать только стационарность - отсутствие реакций, ничего не говоря о том, могла бы реализация принять стимул или нет. Здесь множество разрешаемых действий

- это «стимул + все реакции», а наблюдаемый отказ - «все реакции». Более того, «в ответ» на одно и то же тестовое воздействие (нажатие кнопки машины тестирования) может наблюдаться не обязательно какой-то один отказ. С тестовым воздействием может быть связано множество отказов, один из которых и будет наблюдаться. Например, в реактивных системах с несколькими выходными каналами посылка стимула с одновременным приёмом реакций по нескольким каналам может вызвать наблюдение частичной стационарности по одному из этих каналов.

В данной статье мы расширяем класс рассматриваемых семантик, предполагая, что оператор указывает не только множество разрешаемых действий, но и множество ожидаемых отказов, которые могут наблюдаться. Это означает, что на кнопке написано множество наблюдений, возможных после нажатия этой кнопки: разрешаемые внешние действия и ожидаемые наблюдаемые отказы как множества действий.

Итак, семантика взаимодействия определяется алфавитом внешних действий L и набором кнопкок - семейством РсП (Lull (L) ). Там, где это нужно для однозначного понимания, кнопку РеР мы будем называть P-кнопкой. Для кнопки РеР множество разрешаемых действий обозначим Pq=PnL, а

72

множество ожидаемых наблюдаемых отказов Рг=РпП ( L ). Операции “г” и “q” распространим также на семейства кнопок: Uq={Pq|PeU} и

Ur={Pr|PeU}. Предполагается, что любое внешнее действие из алфавита разрешается некоторой кнопкой u (Pq) =L. Отказ, являющийся элементом семейства Рг, то есть наблюдаемый (в принципе) отказ, будем называть R-отказом. Такую семантику мы называем Р-семантикой. Она отличается от R/Q -семантики в [4,6,7,8] тем, что для P-кнопки Р необязательно Pr= { Pq}, как для R-кнопки в R/Q-семантике, то есть R-отказов, ожидаемых при нажатии P-кнопки, может быть несколько, и они не обязательно совпадают с множеством разрешённых действий. Если Рг=0, то такая Р-кнопка соответствует Q-кнопке в R/Q -семантике, и такую P-кнопку мы также будем называть Q-кнопкой в Р-семантике. Соответственно, P-кнопку Р, содержащую отказы Рг^0, будем называть также R-кнопкой в Р-семантике.

2.2. Безопасное тестирование

При тестировании возможно возникновение тупика, когда никакого наблюдения нет, и неизвестно, будет ли оно через какое-то время или не будет никогда.

Это возможно при нажатии кнопки Р, если реализация не может выполнить ни одно разрешённое действие из Pq, но отказов из Рг также нет - для каждого отказа RePr\Pq реализация могла бы выполнить некоторое неразрешённое действие zeR\Pq. В R/Q-семантике это было возможно только при нажатии Q-кнопки, но в Р-семантике это возможно также при нажатии R -кнопки Р, которая содержит отказ, не вложенный во множество разрешённых действий, то есть, когда uPrvPq. Понятно, что, если мы хотим, чтобы тест заканчивался через конечное время с вынесением соответствующего вердикта (pass или fait), то мы должны избегать при тестировании возникновения тупика.

Кроме внешних, наблюдаемых действий, реализация может совершать внутренние, ненаблюдаемые (и, следовательно, неразличимые оператором) действия, которые обозначаются символом х. Выполнение х-действий не регулируется оператором - они всегда разрешены. Отказ может наблюдаться только тогда, когда реализация не может выполнять не только внешние действия из этого отказа, но и х-действия. Предполагается, что любая конечная последовательность любых действий совершается за конечное время, а бесконечная последовательность - за бесконечное время. Бесконечная последовательность х-действий называется дивергенцией («зацикливание») и обозначается символом Д. Само по себе возникновение дивергенции не опасно, однако при наличии дивергенции любое продолжение тестирования, то есть нажатие любой кнопки, не гарантирует наблюдения через конечное время. Эго объясняется тем, что оператор, ничего не наблюдая, не знает, случится ли такое наблюдение в будущем, или реализация так и будет

73

бесконечно долго выполнять свои внутренние действия. Для конечных (по времени выполнения) тестов это плохо.

Кроме этого, мы вводим специальное, не регулируемое кнопками, действие, которое называем разрушением и обозначаем символом у. Оно моделирует любое запрещённое или недекларированное поведение реализации. Например, в терминах пред- и постусловий поведение программы определено (постусловием) только в том случае, когда выполнено предусловие обращения к ней. Если же предусловие нарушено, поведение программы считается полностью неопределённым. Семантика разрушения предполагает, в частности, что в результате такого поведения система может быть разрушена. Если в реализации после выполнения некоторого внешнего действия возможно разрушение, нажатие кнопки, разрешающей это действие, может привести к разрушению. Опасность возникновения разрушения при тестировании подразумевается его семантикой.

Итак, поскольку мы ограничиваемся конечными по времени выполнения тестами и не хотим разрушать реализацию, мы должны избегать при тестировании возникновения тупиков, попыток выхода из дивергенции и разрушения. Такое тестирование называется безопасным.

Можно также отметить, что нажатие кнопки Р с пустым множеством Pq разрешаемых действий не эквивалентно отсутствию нажатой кнопки. В обоих случаях все внешние действия запрещены, однако при нажатии R-кнопки Р, то есть Р^0, возможно наблюдение отказа RePr: оператор узнаёт об остановке машины, когда она не может выполнять внутренние действия, разрушение и действия из отказа R, даже если бы они были разрешены. Кнопка Р с пустым множеством разрешённых действий Pq не может вызвать разрушения после действия (никакого действия быть не может), но она опасна, если есть дивергенция, как и любая другая кнопка. Кнопка {0} запрещает все внешние действия и разрешает наблюдение только пустого отказа, означающего остановку машины, когда она не может выполнять внутренние действия и разрушение. Пустую кнопку 0 вообще никогда нельзя нажимать, поскольку никакого наблюдения быть не может; такая кнопка соответствует отсутствию нажатой кнопки. Поэтому будем считать, что 0gP.

2.3. LTS-модель и трассовая модель

В качестве модели реализации и спецификации мы используем систему помеченных переходов (LTS - Labelled Transition System). LTS - это ориентированный граф с выделенной начальной вершиной, дуги которого помечены некоторыми символами. Формально, LTS - это совокупность S=LTS (Vs, L, Es, s0), где Vs - непустое множество состояний (вершин графа), L - алфавит внешних действий, EscVsx (Lu{x,y}) xVs -множество переходов (помеченных дуг графа), s0eVs - начальное состояние

(начальная вершина графа). Переход из состояния s в состояние s' по действию z обозначается s—z—>s'. Обозначим

s—z—>■ =def 3s' s—z—и s—z| =def fs' s—z—'.

Выполнение LTS, помещённой в «чёрный ящик» машины тестирования, сводится к выполнению того или иного перехода, определённого в текущем состоянии и разрешаемого нажатой кнопкой (х- и у-переходы разрешены при нажатии любой кнопки и при отсутствии нажатой кнопки). Состояние s LTS-модели S называется стабильным, если в нём не определены х- и у-переходы:

stab (s, S) =def s—х I & s—у I.

Состояние называется дивергентным, если в нём начинается бесконечная цепочка х-переходов (в частности, х-цикл, в том числе, х-петля). Отказ порождается стабильным состоянием, в котором нет переходов по действиям из этого отказа. Если в данном состоянии при данной нажатой кнопке (или отсутствии нажатых кнопок) возможно выполнение нескольких действий, то недетерминированным образом выбирается одно из них. Также, если в стабильном состоянии при нажатой кнопке Р возможно выполнение внешних действий из Pq, и имеются один или несколько отказов из Рг, то недетерминированным образом выбирается выполнение одного из этих действий, или никакое действие не выполняется, а оператор наблюдает один из отказов. Это отличается от R/Q -семантики, где при отказе никакое

действие не может выполняться, поскольку Рг= { Pq } .

Обозначим через obs (s, Р, S) множество действий и отказов, порождаемых

состоянием s LTS-модели S, когда нажата кнопка Р:

obs ( s,P,S) =def {zePqls—z—>■} u { RePr I VzeRu {x, у} s—z|}.

Для получения трасс (последовательностей наблюдений) LTS достаточно добавить в каяедом стабильном состоянии виртуальные петли, помеченные порождаемыми действиями и отказами, а также добавить Д-переходы во всех дивергентных состояниях. После этого рассматриваются все конечные маршруты LTS, начинающиеся в начальном состоянии и не продолжающиеся после Д- или у-перехода. Трассой маршрута считается последовательность пометок его переходов с пропуском х-переходов. Такие трассы мы называем полными или F-трассами, а множество F-трасс LTS S - полной трассовой моделью или F-моделью, и обозначаем F (S). F-трасса, все отказы которой принадлежат семейству Рг, называется R-трассой. Это те трассы, которые могут наблюдаться на машине тестирования в Р-семантике (дивергенция и разрушение считаются условно наблюдаемыми). Множество всех R-трасс LTS, то есть проекция её F-модели на алфавит, состоящий из всех внешних

действий, R-отказов, символов Д и у, называется R-моделью, соответствующей «взгляду» на реализацию в Р-семантике.

Обозначим через obs (ст, Р, S) множество действий и отказов, продолжающих трассу во множестве F-трасс LTS-модели S, то есть порождаемых всеми состояниями после трассы ст LTS-модели S, после нажатия кнопки Р:

obs {а, P,S) =def {ue Р | ст-{и)е^( S) } =u {obs (s, P, S) | s e (S after ст)}.

2.4. Гипотеза о безопасности и безопасная конформность

На уровне модели безопасное тестирование, прежде всего, предполагает формальное определение отношения безопасности «кнопка безопасна в модели после R-трассы». При безопасном тестировании будут нажиматься только безопасные кнопки. Это отношение различно для реализационной и спецификационной моделей.

В LTS-реализации I отношение безопасности означает, что нажатие кнопки РеР после R-трассы ст не может а) означать попытку выхода из дивергенции (после трассы нет дивергенции), Ь) вызывать разрушение (после действия, разрешаемого кнопкой) и с) приводить к тупику. В произвольной Р-семантике для определения условий а) и Ь) достаточно F-трасс модели, но для определения условия с), вообще говоря, недостаточно F-трасс. и приходится использовать LTS-модель. Последнее условие означает, что в каком бы стабильном состоянии после трассы не оказалась реализация, при нажатии кнопки Р будет какое-либо наблюдение.

Р safeltjn I after ст =def VzePq o-(z ,y)<£F (I) & o-(A)<£F (I).

P safe in I after ст =def

P safejAin I after ст & Vs e (I after ст) (stab (s, I) => obs (s, P, I) ^0).

Существует важный частный случай, когда вся информация, необходимая для определения отношения safe in, содержится в F-трассах модели. Это случай, когда для каждой кнопки Р все R-отказы состоят только из разрешаемых действий uPrcPq:

Р safe in I after CT=def P safejAin I after ст & (Pr=0 => cr-(Pq)gF (I) ).

В спецификации отношение безопасности кнопок, называемое safe by, определяется не однозначно. Фактически, речь идёт о правилах, которым должно быть подчинено это отношение. Задание спецификации означает задание не только LTS-модели S, но и отношения safe by, подчиняющегося этим правилам. Таких правил два. Правило 1): если кнопка безопасна после трассы, то её нажатие не может вызвать разрушение и попытку выхода из дивергенции, а кроме того, хотя бы в одном (не обязательно в каждом)

состоянии после трассы возможно наблюдение при нажатии этой кнопки (в этом состоянии нет тупика). Правило 2): если после трассы (хотя бы в одном состоянии после трассы) есть некоторое наблюдение, которое можно получить, нажимая кнопку, не приводящую к разрушению или попытке выхода из дивергенции, то одна из таких кнопок должна быть безопасна после трассы. Это правило требует «максимального» использования спецификации, то есть в ней не должно быть трасс, которые не могут быть проверены при тестировании, за исключением, конечно, таких трасс, проверка которых может вызвать разрушение или попытку выхода из дивергенции. Такое отношение safe by всегда существует: достаточно объявить безопасной каждую кнопку, которая не приводит к разрушению или попытке выхода из дивергенции и разрешает наблюдение, продолжающее трассу: V Р е Р Vu

1) Р safe by S after ст =>

P safejAin S after ст & 3s e (S after ст) obs (s, P, S) Ф0.

2) P safejAin S after ст & 3s e (S after a) ueobs (s, P, S) =>

3ReP R safe by S after ст & ueobs ( s , R, S) .

Заметим, что в последней строке вместо ueobs (s, R, S) можно написать

просто и е R.

В отличие от отношения safe in, правила отношения safe by всегда могут быть определены только в терминах F-трасс модели. Это можно объяснить тем, что спецификация должна говорить о безопасности или опасности реализации, а также о её конформности или неконформности только на основании трасс.

VPeP Vu

1) Р safe by S after ст =>

P safejAin S after ст & obs (ст, P, S) Ф0.

2) P safeyAin S after ст & u e obs (ст, P, S) =>

3ReP R safe by S after ст & ueobs (ст, R, S) .

Заметим, что в последней строке вместо ueobs (ст, R, S) можно написать

просто и е R.

Безопасность кнопок определяет безопасность наблюдений (действий и R-отказов) после R-трассы. Наблюдение безопасно, если безопасна какая-нибудь кнопка, которой оно принадлежит. Теперь мы можем определить безопасные трассы. R-трасса безопасна, если 1) модель не разрушается с самого начала (сразу после включения машины ещё до нажатия первой кнопки), то есть в ней нет трассы (у), 2) каждый символ трассы безопасен после непосредственно предшествующего ему префикса трассы. Множества безопасных трасс

реализации I и спецификации S обозначим Safeln (I) и SafeBy (S) соответственно.

Требование безопасности тестирования выделяет класс безопасных реализаций, то есть таких, которые могут быть безопасно протестированы для проверки их конформности или неконформности заданной спецификации. Этот класс определяется следующей гипотезой о безопасности: реализация I безопасна для спецификации S, если 1) в реализации нет разрушения с самого начала, если этого нет в спецификации, 2) после общей безопасной трассы реализации и спецификации любая кнопка, безопасная в спецификации, безопасна после этой трассы в реализации:

I safe for S =def (<y)gF(S) =s> <y)gF(I))

& VneSafeBy (S) rSafeln (I) VPeP

(P safe by S after ct => P safe in I after ct).

Следует отметить, что гипотеза о безопасности не проверяема при тестировании и является его предусловием. После этого можно определить отношение (безопасной) конформности: реализация I безопасно конформна (или просто конформна) спецификации S, если она безопасна и выполнено тестируемое условие: любое наблюдение, возможное в реализации в ответ на нажатие безопасной (в спецификации) кнопки, разрешается спецификацией:

I saco S =def I safe for S

& VneSafeBy (S) rSafeln (I) VP safe by S after ct

obs (a, P, I) с obs (a, P, S).

2.5. Отказы и множество разрешаемых действий

Выше мы указали на важный подкласс Р-семантик с ограничением вложенности: для каждой кнопки Р все R-отказы состоят только из

разрешаемых действий uPrcPq. Этот подкласс семантик оказывается не

эквивалентным классу всех Р-семантик. Мы покажем, что существует такая семантика Р, такая спецификация S и такая реализация I, которая безопасна I safe forР S, но не конформна I saco? S, а для любой семантики Р1 с ограничением вложенности имеет место I sacon S. Это означает, что семантики без ограничения вложенности обладают большей способностью различения моделей, чем семантики с таким ограничением.

Рассмотрим пример на Рис. 3.

Здесь для семантики Р без ограничения вложенности реализация безопасна I safe forр S, но не конформна спецификации I sacov S. Действительно, трасса ст=({Ь},а) безопасна в реализации и спецификации: не SafeBy (s) c\Safe!n (I). Кнопка Р= {b} безопасна в спецификации после этой трассы: Р safe by S after ст. В реализации после нажатия этой кнопки 78

может наблюдаться действие: Ьеойж (ст, Р, I), а в спецификации - не может: Ъ<£оЬв (ст, Р, Б). Заметим, что после трассы ц=(а) любая кнопка из Р безопасна в спецификации (и в реализации) и любое наблюдение, возможное в реализации (действие а или Ь), возможно также в спецификации.

Семантики с ограничением вложенности могут содержать только следующие кнопки:

{а}, { а, { а } }

{Ь}, {Ь,{Ь}}, { а,Ь, { а } }, {а,Ь,{Ь}}, {а,Ь,{а,Ь}}, { а,Ь, { а}, {Ь } }.

В спецификации в самом начале (после пустой трассы) безопасны только кнопки первой строки, поскольку действие Ь разрушающее. Следовательно, трасса ст=({Ь},а) оказывается опасной в спецификации. Остаётся безопасной трасса ц=(а). но после неё любое наблюдение, возможное в реализации (действие а или Ь), возможно также в спецификации. Тем самым, в любой семантике Р1 с ограничением вложенности имеет место I «ясорх Б.

S

Q

Рис.З. Семантика Р без ограничения вложенности:

L = {а,Ь} и P={{a,{b}},{b}}.

2.6. Параллельная композиция и генерация тестов

В LTS-теории взаимодействие двух систем моделируется оператором параллельной композиции. Мы используем оператор композиции, аналогичный тому, который определяется в алгебре процессов CCS (Calculus of Communicating Systems) [14,16]. Будем считать, что для каждого внешнего действия z определено противоположное действие z такое, что jl=z. Например, посылке стимула из теста соответствует приём теста в реализации, а выдаче реакции реализацией соответствует приём этой реакции в тесте. Операцию «подчёркивание» распространим на множества действий: А={а|аеА}. Параллельное выполнение двух LTS в алфавитах А и В понимается так, что переходы по противоположным действиям z и z, где z еАпВ, выполняются синхронно, то есть в обеих LTS одновременно, причём в композиции это становится т-переходом. Такие действия называются

синхронными. Остальные внешние действия zeA\B и zeB\A, а также символы х и у называются асинхронными. Переход по такому символу выполняется в одной из LTS при сохранении состояния другой LTS. Результатом композиции двух LTS I и Т становится LTS 1^Т в алфавите А^В =def (А\В) и (В\А). Её состояния - это пары состояний it LTS-операндов, начальное состояние - это пара начальных состояний, а переходы порождаются следующими правилами вывода:

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

(1) ze (Au{x,y} )\В & i—z—>i ' □ it—z—»i't,

(2) ze (Bu{x,y] ) \A & t—z—>t' □ it—z—>it',

(3) zeAnB & i—z—>i ' & t—z—>t' □ it—x—>i't'.

Тестирование понимается как замкнутая композиция LTS-реализации I в алфавите А и LTS-теста Т в противоположном алфавите В=А. Мы будем предполагать, что в тесте нет разрушения и х-переходов. Для обнаружения R-отказа R в тесте (но не в реализации!) допускается специальный переход по R-отказу, который может срабатывать тогда, когда в реализации нет х- и у-переходов, а также переходов по действиям из R. Для удобства мы будем записывать в тесте переход не по R, а по множеству противоположных действий R.

(4) VzeRu{x,y} i—z| & t—R—>t' □ it—x—»it'.

Заметим, что переход по R-отказу играет ту же роль, что 9-переход в R/Q-семантике. Но здесь есть два важных отличия. Во-первых, при нажатии Р-кнопки Р переход по R-отказу Re Рг может срабатывать даже тогда, когда в реализации могут выполняться действия zePq\R. В то же время 9-переход срабатывает только тогда, когда ни одно действие не может выполняться, поскольку Pr= {Pq}. Во-вторых, в Р-семантике кнопка не однозначно определяет возможный отказ, поскольку множество Рг может содержать несколько отказов. Также множество разрешаемых действий, то есть действий, противоположных тем, которыми помечены переходы в состоянии теста, в Р-семантике не однозначно определяет возможный в тесте переход по R-отказу, поскольку может быть несколько P-кнопок Р с одним и тем же множеством разрешаемых действий Pq, но с разными множествами отказов Рг. В отличие от этого, в R/Q -семантике множество разрешаемых действий, образующее R-кнопку, однозначно определяет соответствующий R-отказ, поскольку Рг= { Pq }. Эго и является причиной того, почему в Р-семантике мы говорим о переходе по R-отказу, а не о 9-переходе.

Поскольку алфавиты реализации и теста противоположны, композиционный алфавит пуст, и в композиционной LTS есть только х- и у-переходы. При безопасном тестировании у-переходы недостижимы. Выполнению теста соответствует прохождение х-маршрута, начинающегося в начальном состоянии композиции 1=^Т. Тест заканчивается, когда достигается

80

терминальное состояние теста. Каждому такому терминальному состоянию назначается вердикт pass или fail. Реализация проходит тест, если состояния теста с вердиктом fail недостижимы. Реализация проходит набор тестов, если она проходит каждый тест из набора. Набор тестов значимый, если каждая конформная реализация его проходит; исчерпывающий, если каждая неконформная реализация его не проходит; полный, если он значимый и исчерпывающий. Задача заключается в генерации полного набора тестов по спецификации.

Обычно ограничиваются так называемыми управляемыми тестами, то есть тестами, которые могут пониматься как однозначная инструкция оператору машины (без лишнего недетерминизма). Для этого множество наблюдений, для которых определены переходы в данном состоянии теста, должно совпадать с какой-нибудь кнопкой РеР (точнее, с Е\ поскольку при композиции CCS тест определяется в противоположном алфавите). Множество внешних действий, для которых определены переходы в данном состоянии теста, должно быть множеством Рд действий, противоположных разрешаемым действиям, а множество отказов, по которым определены переходы, должно совпадать с множеством EV Оператор, исполняя тест, однозначно определяет, какую кнопку ему нужно нажимать в данном состоянии теста, и для каждого возможного наблюдения у него есть «инструкция» по дальнейшему поведению, задаваемая соответствующим переходом теста по этому наблюдению.

Полным набором всегда является набор всех примитивных тестов. Примитивный тест строится по одной выделенной безопасной R-трассе спецификации. Для этого сначала в трассу перед каждым наблюдением вставляется какая-нибудь безопасная (после префикса трассы) P-кнопка Р, которой это наблюдение принадлежит. Перед каждым R-отказом R вставляется безопасная кнопка Р такая, что Re Рг, а перед каждым действием z - безопасная кнопка Р, разрешающая это действие, то есть zePq. Безопасность трассы гарантирует наличие такой безопасной кнопки Р. Выбор кнопки Р может быть неоднозначным, то есть по одной безопасной трассе спецификации можно сгенерировать, вообще говоря, множество разных примитивных тестов. После расстановки кнопок получается последовательность, которая во втором разделе статьи называется Р-историей. По ней и строится LTS-тест (рис. 4). Его состояниями становятся расставленные кнопки, начальное состояние - это первая в трассе кнопка, символы переходов из состояния-кнопки Р - это все возможные наблюдения (точнее, противоположные им): действия геРд и отказы ReEV Если это не последняя кнопка, то один переход ведёт в состояние, соответствующее следующей кнопке. Остальные переходы ведут в терминальные состояния. Вердикт pass назначается тогда, когда соответствующая R-трасса есть в спецификации, а вердикт fail - когда нет. Такой вердикт соответствует строгим тестам, которые, во-первых, значимые (не ловят ложных ошибок) и,

81

во-вторых, фиксируют обнаруженные ошибки (выносят вердикт fail, а не pass). Любой строгий тест можно заменить на объединение примитивных тестов, которое обнаруживает те же самые ошибки.

fail*-

fail-

^плохой Є A f Ny <эХОРОШИЙ Є А

pass

Ьіиохон Є В

<■>

Ьхорошни Є В

' pass

fail-

сплохой Є С

О

С хороший Є С

■ pass

Для ИеРг и Ь,сеЬ ст=(К,Ь,с)=>вставляем безопасные кнопки=>

=>(А,К,В,Ь,С,с) такие, что: А, В, СеР, ИеА, ЬеВ, сеС.

Наблюдение и имеет индекс «::ороший». СС.П1 наблюдение и есть в спецификации после

префикса трассы; иначе -индекс «пло;;ой».

pass

Рис.4. Примитивный тест для безопасной К-трассы а

На практике возникают две основные проблемы, связанные с применением теории тестирования конформности: проблема недетерминизма и глобального тестирования и проблема бесконечности полного тестового набора. Эти проблемы в общем виде рассматривались в [4,6,7,8] для ИДЗ-ссмантики. Обобщение до Р-семантики не вносит в это рассмотрение ничего принципиально нового. Поэтому мы не будем здесь останавливаться на этих проблемах.

3. Р-семантика с приоритетами

До сих пор мы предполагали отсутствие приоритетов между действиями, которые тестируемая система может выполнять в данной ситуации: любое определённое в реализации и разрешённое оператором действие может быть выполнено (выбор одного из таких действий выполняется недетерминированным образом). В то же время для реальных программных и аппаратных систем это правило не всегда адекватно отражает требуемое поведение системы. Рассмотрим несколько примеров.

Выход из дивергенции. При наличии дивергенции запрос, поступающий извне, может бесконечно долго игнорироваться системой, если он имеет тот

же приоритет, что и внутренняя активность. Если речь идёт о составной системе, собранной из нескольких компонентов, то дивергенция может быть естественным результатом бесконечного взаимодействия компонентов меяеду собой. И в этом случае для обработки запроса, поступающего в систему (в один из её компонентов) извне, он должен иметь больший приоритет, чем внутреннее взаимодействие.

Выход из осцилляции (приоритет приёма над выдачей). Под осцилляцией понимается бесконечная цепочка выдачи реакций реактивной системой. Для того, чтобы такую цепочку можно было прервать, заставив систему обрабатывать поступающий извне стимул, приём стимула должен иметь больший приоритет, чем выдача реакций.

Приоритет выдачи над приёмом в неограниченных очередях. Этот обратный пример характерен для неограниченной очереди, используемой в качестве буфера меяеду взаимодействующими системами, в частности, при асинхронном тестировании (тестировании в контексте). Здесь нужно, чтобы выборка из очереди была приоритетней постановки в очередь. В противном случае очередь имеет право только принимать сообщения и никогда их не выдавать. При асинхронном тестировании для входной очереди это означает, что все стимулы, посылаемые тестом, не доходят до реализации, бесконечно накапливаясь в очереди. Соответственно, для выходной очереди это означает, что тест может не получать никаких реакций от реализации, хотя она их выдаёт, поскольку они «оседают» в очереди.

Прерывание цепочки действий. Команда «отменить» (cancel) должна останавливать выполнение последовательности действий, инициированной предыдущим запросом, и вызывать цепочку завершающих действий. При отсутствии приоритетов такая команда, даже если она выдана сразу после выдачи запроса, имеет право быть выполнена только после того, как вся обработка закончится, то есть, фактически, ничего «не отменяет».

Приоритетная обработка входных воздействий. Если в систему поступает одновременно несколько запросов, то часто требуется их обработка в соответствии с некоторыми приоритетами между ними. Эго часто реализуется в виде очереди запросов с приоритетами или в виде нескольких очередей запросов с приоритетами между очередями. К этому типу приоритетов относится и обработка аппаратных прерываний в операционной системе.

В существующих теориях тестирования конформности (conformance testing) подразумевается отсутствие приоритетов [10]. Эго не даёт возможности проверять при тестировании выполнение тех требований к системе, которые могут быть выражены только в форме приоритетов. В [8] предложен способ введения приоритетов для R/Q -семантики. В данной статье мы распространяем этот способ на Р-семантику. При таком распространении, на самом деле, мало что меняется, за исключением того, что при нажатии кнопки наблюдаемый отказ не обязательно совпадает с множеством разрешаемых оператором действий (от которого и зависят приоритеты).

3.1. Предикаты на переходах ЬТЭ-модели

Независимо от наличия или отсутствия приоритетов семантика взаимодействия предполагает, что выполняться может только то действие, которое определено в реализации и разрешено оператором машины тестирования. Если приоритетов нет, то выполняться может любое определённое и разрешённое действие, и выбор выполняемого действия не детерминирован. Наличие приоритетов означает, что не все определённые и разрешённые действия могут выполняться, то есть выполнимость действия зависит также от того, какие ещё действия определены и/или разрешены. Эту зависимость можно изобразить в виде предиката от множества разрешённых действий, который назначается переходу ЬТ8-модели. Поскольку для перехода в—2—>з известно его предсостояние в, а для этого состояния в известно, какие ещё переходы в нём начинаются, предикат на переходе можно считать не зависящим от множества определённых (в состоянии в) действий. В то же время переходы по одному и тому же действию, ведущие из разных состояний, могут иметь разные предикаты.

ЬТ8-модель с приоритетами - это ЬТ8, алфавит которой - это декартово произведение алфавита внешних действий и множества предикатов на алфавите внешних действий П={7г: П (Ь) -^Воо1]:

8=ЬТЗ (У5, ЬхП, Е5, з ). Переход в—2,71—>з ' может выполняться только тогда, когда оператор разрешает такое множество внешних действий ОсЬ, ЧТО 2 6 0_'и { X , у } И 71 ( 0.) =1гие. Если есть несколько выполнимых действий, выполняется одно из них, выбираемое, по-прежнему, недетерминированным образом.

Предикат можно понимать как булевскую функцию от булевских переменных т,1г т,2,..., взаимнооднозначно соответствующих внешним действиям из алфавита Ь. Например, для предиката 7г=а&-1^с переход в—г,п^-Б' может выполняться только тогда, когда оператор разрешил такое множество внешних действий 0, что г<ЕО.'и{г,у} & (аеО. & Ъ<£0. V се(£). Это означает, что действие 2 - это внутреннее действие, разрушение или

внешнее действие, разрешённое оператором, а также выполнено хотя бы одно из двух условий: 1) оператор разрешил действие а и не разрешил действие Ь, 2) оператор разрешил действие с.

Итак, в общем случае предикат - это булевская функция от множества разрешённых действий. Можно отметить важный частный случай, когда предикат зависит только от разрешённых и определённых внешних действий. Иными словами, предикат на переходе в—2, п—>з ' не зависит булевских переменных, соответствующих внешним действиям, по которым нет переходов из состояния в. Эго означает, что выполнимость перехода зависит только от того, разрешено ли действие 2, и какие ещё действия определены в состоянии в и разрешены оператором. В этом случае реализацию не

интересуют (она «не видит») те действия, которые оператор разрешает, но они всё равно не могут выполняться, поскольку не определены в текущем состоянии реализации. Нажимая кнопку, оператор как бы «подсвечивает» некоторые действия реализации, определённые в её текущем состоянии, и выполнимость перехода по каждому из них определяется соответствующим предикатом от множества «подсвеченных» действий.

Предикат п как булевская функция от булевских переменных-действий может быть представлен в виде совершенной дизъюнктивной нормальной формы (СДНФ) 7l=T|iVr|2V..., где T|i=Xii&Xi2&..., Xij = Zj ИЛИ Xij=-iZj,H Zj пробегает множество всех внешних действий. Тогда переход s—z, 71—>s ' можно заменить на множество кратных переходов с предикатами-

дизъюнктами S-------Z,T|i—»s'. В СВОЮ очередь, дизъюнкту Г|

взаимнооднозначно соответствует множество Qi тех действий, для которых Xij = Zj. При композиции это множество является множеством действий, разрешаемых партнёром. Тем самым, мы можем считать, что на переходах написаны не произвольные предикаты, а множества разрешаемых действий s—z, Рiq—»s ', или кнопки s—z, Pi—>s '. Когда нажимается некоторая кнопка Pi, выполняться могут только переходы вида s—z, Piq—>s ' или s—z, Pi—>s ', где z e Plqu {x, у}. Такой переход от LTS с предикатами к LTS с кнопками аналогичен переходу от расширенных автоматов (EFSM -Extended Finite State Machine) к обычным автоматам (FSM). Для заданной Р-семантики речь идёт только о тех кнопках, которые принадлежат семейству Р; переходы по другим кнопкам при тестировании, фактически, игнорируются

- они не могут выполняться при тех тестовых возможностях, которые задаются семантикой.

3.2. Стабильность, отказы, разрушение и дивергенция

Для машины без приоритетов отказ R наблюдается в стабильном состоянии (состоянии без х- и у-переходов), в котором нет переходов по действиям из R. Если есть приоритеты, то меняется, преяеде всего, само понятие стабильности. Оно становится условным, то есть зависящим от множества разрешённых действий Pq: состояние s LTS S стабильно, если для всех х- и у-переходов из этого состояния их предикаты от Pq ложны 7i (Р(|) =false. stab { S,P,S) =def Гтт 71 (Pq) & (s X,7I—>■ V S y,7I—>■).

Соответственно, меняется условие наблюдения отказа RePr: отказ

наблюдается в стабильном состоянии, в котором для всех переходов s—z, 71—> по действиям zeR их предикаты ложны n{Pq)=false.

Здесь мы должны уточнить, что происходит, когда кнопка отжимается. Для машины без приоритетов кнопка автоматически отжимается при любом наблюдении действия или отказа. После действия машина может выполнять любые х-переходы (а также у-переход), но после отказа машина стоит,

поскольку отказ происходит в стабильном состоянии, в котором нет X- и у-переходов. Однако для машины с приоритетами отжатие кнопки меняет множество разрешённых действий, если только не была нажатой кнопка Р с Рд=0, не разрешающая ни одного внешнего действия. После наблюдения реализация начинает выполнять х-переходы с приоритетом л (0) =1гие. Заметим, что таким наблюдением может быть не только действие, но и отказ. Причина этого в том, что отказ Р.е Р, означал невозможность выполнения внешних действий 2 е И, а также х- и у-переходов, поскольку их предикаты стали ложны л (Рч) =/аЬе. После отжатия кнопки Р множество разрешённых внешних действий пусто, и теперь могут выполняться х- и у-переходы с предикатами л (0) =1гие. Далее оператор может снова нажать ту же кнопку или другую кнопку.

Если допускается переключение кнопок, то есть нажатие второй кнопки без ожидания наблюдения по первой кнопке, то это интерпретируется как отжатие первой кнопки с последующим нажатием второй кнопки. Мы будем считать, что «в промежутке» между двумя кнопками создаётся ситуация, когда ни одна кнопка не нажата, и реализация может выполнять х- и у-переходы с предикатами л (0) =1гие. Общая парадигма здесь заключается в том, что ситуация отсутствия тестового воздействия возникает всегда при включении машины (до нажатия первой кнопки), после любого наблюдения и между двумя тестовыми воздействиями при отсутствии наблюдения по первому воздействию. Более подробно переключение кнопок рассматривается в следующем подразделе.

При отсутствии приоритетов разрушение возможно либо с самого начала до нажатия какой-либо кнопки, либо после выполнения некоторого внешнего действия, разрешённого нажатой кнопкой. В первом случае любое тестирование опасно (машину нельзя включать). При наличии приоритетов выполнимость перехода по разрушению в—у, п—>. как и для любого перехода, определяется предикатом л, который зависит от множества разрешённых действий. Поэтому следует говорить о выполнимом или не выполнимом разрушении в зависимости от нажатой кнопки. Разрушение может стать выполнимым при нажатии или отжатии кнопки, то есть разрушение возможно не только с самого начала или после внешнего действия, но также сразу после нажатия кнопки Р, если л (Рч) =1гие, или после наблюдения отказа из Рг, если % (0) =1гие. В последнем случае, правда, разрушение было выполнимым и до нажатия кнопки Р.

Мы уже говорили, что даже для машины без приоритетов проблема дивергенции состоит не в дивергенции самой по себе, а в выходе из неё. При наличии приоритетов, если внешнее воздействие имеет больший приоритет, чем внутренняя активность, дивергенция прекращается. Теперь выполнимость х-действий зависит от нажатой кнопки, и мы можем косвенно управлять ими и, следовательно, дивергенцией. Тогда можно говорить о выполнимой 86

дивергенции: при одной нажатой кнопке (или когда нет нажатой кнопки) все т-действия бесконечной цепочки выполнимы, а при другой - нет и, следовательно, нет «зацикливания». Выйти из дивергенции, которая начинает выполняться после кнопки А, можно с помощью кнопки В, при которой дивергенция не выполнима. Заметим, что для этого требуется переключение кнопок, то есть нажатие кнопки без наблюдения (которого может не быть). Единственный случай, когда из дивергенции нельзя гарантированно выйти, -это когда дивергенция выполнима при нажатии любой кнопки.

3.3. Переключение кнопок

В машине без приоритетов кнопку можно нажимать либо после включения машины, либо после того, как произошло наблюдение по предыдущей кнопке. Иными словами, запрещается переключать кнопки без наблюдения, отжимая одну кнопку и нажимая другую. Этот запрет объясняется тем, что, если приоритетов нет, возможность переключения кнопок не увеличивает мощность тестирования. Действительно, если была нажата кнопка Р, а потом без наблюдения нажата другая кнопка 0. (а кнопка Р отжата), то в этом интервале времени реализация могла выполнять только т-действия. Но т-действия всегда разрешены, поэтому реализация могла бы выполнять их и в том случае, когда вместо кнопки Р сразу нажималась кнопка 0. (а второй раз, естественно, не нажималась). Тем самым, любое поведение, которое можно наблюдать в первом случае, можно было бы наблюдать и во втором случае.

При наличии приоритетов переключение без наблюдения необходимо для полноты тестирования, поскольку различные множества разрешённых действий по-разному влияют на выполнение х-действий (т-переходы тоже могут иметь предикаты), что приводит к внешне различимым поведениям. Например, если в реактивной системе приём стимула приоритетнее выдачи реакций и х-действий, последние выполняются только тогда, когда реализация не может принять стимул, посылаемый ей тестом. На рис. 5 показан пример, где для получения тестом реакции ! у после стимула ? а нельзя сразу посылать этот стимул (тогда после него будет реакция ! х), а нужно сначала послать стимул ?Ь, например, с помощью кнопки {?Ь}, а потом переключить эту кнопку на кнопку, посылающую стимул ?а, например, { ? а}. Если реализация принимает стимул ?Ь, то переключение нужно успеть сделать до приёма стимула ?Ь. Если же реализация блокирует стимул ?Ь (нет пунктирного перехода), то можно «не торопиться». Если блокировка {?Ь} наблюдаема, то есть нажималась не кнопка {?Ь}, а кнопка { ?Ь, { ?Ь} }, можно сначала дождаться блокировки { ?Ь}, а потом послать стимул ?а.

! х, 1гие ?а, 1гче т, ->?а& ?Ь ?а, 1те ! у, (те

-------тм------о—^^---------------►#—:----►#

»

I

1 ?Ь, (гие ■

I

Рис. 5. Переключение кнопок

Тем не менее, в пользу запрета на переключение кнопок имеются разумные аргументы и в случае наличия приоритетов. Дело в том, что переключение кнопок позволяет «обходить» тупики: если оператор переключает кнопку Р на (любую) другую кнопку <2, то возникновение тупика при нажатии кнопки Р не препятствует такому переключению (как на рис. 5, когда нет пунктирного перехода по стимулу ?Ь, а блокировка {?Ь} не наблюдаема при посылке стимула ?Ь). Но если возможен тупик, то при безопасном тестировании мы не можем нажимать кнопку Р без последующего переключения на другую кнопку, то есть с ожиданием наблюдения (на О без пунктирного перехода кнопку { ?Ь} всегда нужно переключать на кнопку { ?а} или какую-то другую). Тем самым, если можно переключать кнопки, то условие безопасности кнопок становится более сложным (ниже мы его подробно рассмотрим). Если переключений кнопок нет, тестирование выглядит более привычно как чередующаяся последовательность тестовых воздействий (нажимается кнопка) и наблюдений. Кроме того, в этом случае к работе оператора предъявляется меньше временных требований.

3.4. Временные ограничения на работу оператора (теста)

Введение приоритетов усложняет работу оператора, налагая более сложные требования по времени. Если приоритетов нет, то оператор должен уметь достаточно быстро нажимать кнопку после включения машины или после предыдущего наблюдения. Заметим, что если оператор не успевает достаточно быстро нажать кнопку, ничего страшного не случится, поскольку машина успеет выполнить только одно или несколько т-действий, которые (в машине без приоритетов) она может выполнить и в том случае, когда кнопка была нажата немедленно. Иными словами, мы требуем, чтобы оператор мог работать быстро, но не заставляем его всегда работать быстро.

Если приоритеты есть, то возможность наблюдения тех или иных поведений реализации требует не только достаточно быстрой скорости работы оператора, но также достаточно медленной, средней и т.д. В примере на рис. 6 стимул ?а может приниматься в трёх состояниях 1, 2 и 3, но реакции после этого различны: !х, !у или \т,. Эти состояния связаны т-переходами, которые

выполнимы только в том случае, когда тест не посылает стимул ?а. Поэтому

реакция ! х будет наблюдаться, только если оператор быстро пошлёт стимул ? а, реакция \т, - только если оператор не будет торопиться, а реакция !у -только при средней скорости работы.

1 т, -i?a г, -i?a з

?а, true la, true

1 Г 1 f Л

О 4 \ о

! у, true ! z, true

1 Г 1 г 1 г

О 4 > •

Рис.6. Интервалы времени

Если есть переключение кнопок, то такое переключение также нужно уметь делать с различными интервалами времени, чтобы «заставить» реализацию проходить нужное число т-переходов между двумя кнопками.

Таким образом, для машины с приоритетами следует учитывать временные задержки, которые делает оператор между наблюдением и последующим нажатием кнопки или между двумя нажатиями кнопок при их переключении без наблюдения. Мы можем считать, что в погодные условия включены также те факторы, которые влияют на «свободу воли» оператора, определяя те или иные временные задержки при нажатии кнопок. Эго согласуется с тем, что оператор должен моделировать любую скорость работы окружения. Работа оператора моделирует выполнение тестовой программы на компьютере. Такая программа недетерминирована только на некотором уровне абстракции, когда мы отвлекаемся от других программ или аппаратуры, влияющих на её поведение.

3.5. Истории

Если приоритетов нет, то возможность наблюдения действия после некоторой предыстории взаимодействия не зависит от того, какая именно нажимается кнопка, разрешающая это действие. При наличии приоритетов это становится важным, поскольку различным кнопкам соответствуют различные множества разрешённых действий, и при нажатии одной кнопки предикат может оказаться истинным, и действие может наблюдаться, а при нажатии другой -ложным, и действие не может наблюдаться. Поэтому теперь нужно запоминать не только наблюдения, но также те кнопки, которые нажимал оператор. Тем самым, результатом тестового эксперимента становится последовательность действий, отказов и кнопок. Такую последовательность мы будем называть историей. Чтобы в истории отличить (^-кнопку р от отказа (и то и другое - подмножество внешних действий), мы будем любую кнопку заключать в кавычки и писать “Р”, а не просто Р. Если не ограничиваться только безопасным тестированием, то мы должны включить в

истории также разрушение и дивергенцию, и после них история не может продолжаться, аналогично трассам. Очевидно, что в истории каждому внешнему действию z непосредственно предшествует кнопка “Р”, разрешающая это действие zePq, а каждому отказу R - R-кнопка “Р”, допускающая этот отказ RePr. Могут или не могут идти две кнопки подряд, зависит от того, разрешено или запрещено переключение кнопок.

Для заданной Р-семантики истории будем называть P-историями. Определим их более формально.

Рассмотрим LTS с предикатами S. Для множества разрешённых действий Pq переход s—z,7i—>s ' будем называть Р9-выполнимым, если его предикат от Pq истинен л (Pq) =true. Будем говорить, что для множества разрешённых действий Pq т-маршрут Рд-выполним, если все его переходы Рд-выполнимы. Пустая P-история заканчивается в состояниях, достижимых из начального состояния по 0-выполнимым т-маршрутам, то есть после включения машины до нажатия какой-либо кнопки. Пусть P-история ст заканчивается во множестве состояний S after ст. Рассмотрим различные продолжения этой P-истории. Мы будем предполагать, что P-история не заканчивается разрушением или дивергенцией, поскольку после дивергенции и разрушения нет продолжений.

Продолжение кнопкой Р, где Р еР. Если допускается переключение кнопок, такое продолжение всегда возможно. Если переключения кнопок нет, Р-история не должна заканчиваться кнопкой. Переключение интерпретируется как отжатие первой кнопки, а потом нажатие второй кнопки. Поэтому сначала реализация может выполнить любой 0-выполнимый х-маршрут, начинающийся в состоянии из S after ст, а затем продолжить выполнение по любому Рч-выполнимому т-маршруту. Множество концов таких маршрутов и будет множеством состояний S after ст-(“Р”). Заметим, что, если история не заканчивалась на кнопку, то концы всех 0-выполнимых т-маршрутов уже входят в S after ст.

Продолжение внешним действием z. Такое продолжение возможно только в том случае, когда сама P-история имеет вид ст-(“Р”), где РеР и zePq, то есть заканчивается кнопкой Р, разрешающей действие z. Наблюдение действия z происходит, когда совершается Рч-выполнимый переход по z из состояния после предшествующей P-истории, то есть переход s—z,7г—>s ', где se (S after ст-(“Р”)) и 7г (Pq) =true. В результате такого перехода кнопка автоматически отжимается, и далее могут выполняться 0-выполнимые т-маршруты до тех пор, пока не возникнет разрушение, пока не будет нажата кнопка (та же самая или другая), или пока оператор не выключит машину, заканчивая сеанс тестирования. Множество концов этих т-маршрутов и является множеством S after ct-(“P”,z).

Продолжение R-отказом R. Такое продолжение возможно только в том случае, когда сама P-история имеет вид ст-(“Р”), где РеР и Re Рг. Отказ R возникает в таком состоянии se (S after ст-(“Р”)), в котором выполнено условие: для каждого перехода s—z,7i—>s ', где zeRu{x,y} должно быть л ( Pq) =false. После отказа кнопка отжимается и реализация может выполнить

0-выполнимый т-маршрут, начинающийся в одном из состояний, где наблюдался отказ. Множество концов этих т-маршрутов и является множеством S after ст-(“Р”, R).Заметим, что состояния, где наблюдался отказ, тоже входят в это множество (для пустого х-маршрута).

Продолжение разрушением у. Такое продолжение возможно только в том случае, когда в некотором состоянии se (S after ст) переход s—y,7i—>s' Pq-выполнимым, если P-история заканчивается кнопкой РеР (наблюдения ещё не было, и продолжает действовать кнопка Р), или 0-выполним в противном случае (после наблюдения не действует никакая кнопка). Поскольку после разрушения нет продолжения, нас не интересует множество состояний после такого продолжения. Заметим, что если разрушение может возникнуть после отказа при нажатии кнопки, то оно могло возникнуть и до нажатия этой кнопки: если возможна история ст-(“Р”, R,y), где RePr, то возможна также история ст-(у).

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Продолжение дивергенцией Д. Поскольку опасна не сама дивергенция, а попытка выхода из неё, нас будет интересовать только такая дивергенция, которая выполнима при нажатой кнопке Р. Такая дивергенция возникает после P-истории вида ст-(“Р”), где РеР, если есть бесконечный Pq-выполнимый т-маршрут, начинающийся в состоянии из S after ст-(“Р”) (очевидно, достаточно считать, что маршрут начинается в состоянии из

S after ст). В этом случае символ Д будет продолжать P-историю после кнопки Р. Поскольку после дивергенции нет продолжения, нас не интересует множество состояний после такого продолжения.

Теперь аналогично трассам определим полные истории, или F-ucmopuu как Р-истории для Р=П ( ЬиП ( L ) ), когда любой набор внешних действий и множеств внешних действий является P-кнопкой. Множество F-историй LTS

S - обозначим так же, как множество F-трасс. - F ( S ), поскольку в дальнейшем мы будем рассматривать только истории, а не трассы. Теперь Р-история LTS - это такая её F-история. в которой встречаются кнопки только из семейства Р, а отказы - это только R -отказы (отказы из Рг).

Обозначим через obs ( s, Р, S ) множество действий и отказов, порождаемых

состоянием s LTS-модели S, когда нажата кнопка Р:

obs { S,P,S) =def {zePq|37T 71 (Pq) & S---Z , 71—>■ }

u { Re Pr | VzeRu {t, y } Çn 71 (Pq) & S----Z,7T—>■}.

Обозначим через obs (ст, Р, S) множество действий и отказов, продолжающих историю во множестве /'’-историй LTS-модели S, то есть порождаемых всеми состояниями после истории ст LTS-модели S, после нажатия кнопки Р:

obs (ст, Р, S) =def {ueP|CT-<“P”,u>6F(S) }

= u{obs (s,P,S) | se (S after ст) }.

3.6. Безопасность и конформность без переключения кнопок

Поскольку выполнимость переходов LTS-модели с приоритетами зависит от предикатов на этих переходах, меняются отношения безопасности кнопок в реализации (safe in) и спецификации (safe by).

Если нет переключения кнопок, то отношения safe in и safe by определяются почти так же, как для машины без приоритетов, за тем исключением, что вместо R-трасс рассматриваются P-истории, безопасность или опасность кнопки определяется только после P-истории, не заканчивающейся кнопкой, продолжение внешним действием зависит от кнопки, дивергенция возможна лишь после кнопки, разрушения не должно быть не только после действия, но также сразу после нажатия кнопки и после R -отказа. В последнем случае, если после нажатия кнопки наблюдается отказ, а потом (после автоматического отжатия кнопки) возникает разрушение, то это разрушение было выполнимо и до нажатия кнопки. В дальнейшем нас не будет интересовать безопасность кнопок после опасных историй, то есть таких, прохождение которых может вызывать разрушение. Поэтому случай разрушения после отказа можно не рассматривать.

Определение отношения безопасности в реализации без переключения кнопок:

Р safein I after ст =<jef ст-(“Р” ,y)&F (I) & VueP ст-(“Р”, u, y)&F( I).

P safetin I after ст =def P safein I after ст & CT-(“P”,A)gF(I)

& Vse (I after ct-(“P”)) (stab (s,P,I) => obs (s , P, I) Ф0).

Случай, когда для каждой кнопки Р все R-отказы состоят только из разрешаемых действий uPrcPq:

Р safetin I after ст =def P safein I after ст & CT-(“P”,A)gF(I)

Требования к отношению безопасности в спецификации без переключения кнопок: VPeP Vu

1) P safe ¡by S after ст => P safeyin S after ст & a-(“P”, A)&F{ S)

& 3se(S а/?ег ct-(“P”)) obs (s, P, S) Ф0.

2) P safeyin S after & 3se (S after ст-<“Р”»

ueoAs ( s , P, S) => 3ReP R safety S after ст & ueobs ( s , R, S) .

Аналогично случаю отсутствия приоритетов, правила отношения safe by всегда могут быть определены только в терминах F-историй модели:

VPeP Vu

1) Р safety S after ст => P safeyin S after ст ст-Л;c--/-',s

2) P safeyin S after ст & ст-(“Р”,A)iF(S)

& ueobs (ст, P, S) =i> 3ReP R safety S after ст & ueoAs (ст, R, S) .

На основе отношений безопасности кнопок в реализации и спецификации определяются безопасные наблюдения, безопасные P-истории Safejn (I) и Safety (S), гипотеза о безопасности и безопасная конформность аналогично тому, как это делалось для трасс без приоритетов.

I safe for S =def (<y)gF(S) <y)gF(I))

& neSafetIiy (S) r Safe/In (I) VPeP (P safe i by S я/ter ст => P safet in I after ст).

I saco S =def I safe for S

& \!<ieSafeJiy (S) r,SafelIn (I) VP safety S я/ter ст

»As (ст, P, I) coAs (ст, P, S).

3.7. Безопасность и конформность с переключением кнопок

Если допускается переключение кнопок, мы можем обходить запрет на возникновение при нажатии кнопки тупика, а также выполняемой дивергенции, просто переключаясь на другую кнопку. Соответственно, модифицируются отношения безопасности: удаляются условия, подчёркнутые волнистой линией, и остаются условия, связанные только с разрушением.

Определение отношения безопасности в реализации с переключением кнопок: Р safe2in I after ст =def Р safeyin I after ст.

Требования к отношению безопасности в спецификации без переключения кнопок: VPeP Vu

1) Р safe2by S after ст => P safeyin S after ст.

2) P safeyin S after ст & 3se (S after CT-<“P”>)

ueobs ( s , P, S) => 3ReP R safe2by S after ст & ueobs ( s , R, S) .

Или, в терминах F-историй модели: V Р е Р Vu

1) P safe2by S after ст => P safeyAin S after ст.

2) P safeyin S after ст

& ueobs (ст, P, S) => 3ReP R safe2by S a/ter ст & ueoAs (ст, R, S) .

Однако возникает вопрос: сколько раз оператор может переключать кнопки?

Мы исходим из следующей парадигмы тестирования: целью тестовых воздействий (нажатия кнопок) является получение наблюдений. Тест не может содержать цепочки переключений кнопок, которая не приводит гарантированно к какому-нибудь наблюдению. Поскольку мы рассматриваем только конечные (по времени выполнения) тесты, цепочка переключений кнопок должна быть конечной и заканчиваться нажатием кнопки, после которой оператору гарантируется получение какого-нибудь наблюдения, что даёт ему возможность, в частности, закончить сеанс тестирования. Это означает, что все кнопки в цепочке, кроме последней, безопасны после непосредственно предшествующего им префикса истории по отношению safe2in/by, а последняя кнопка - по отношению safe ¡in/Ьу.

Р safein I after ст =def ЗР0=Р, Рх,..., PneP & Vi=0..n-1 Pi safe2in I after ct-(“P0”, “Pi”, ..., “Pi-i”)

& Pn safexin I after ct-(“P0”, “Pi”, ..., “Pn-i”),

P safe by S after ст =def 3P0=P, Pi,..., PneP & Vi=0..n-1 Pi safe2by S after ct-(“P0”, “Pi”, ..., “Pi-i”)

& Pn safe¡by S after ct-<“P0”, “Pi”, ..., “Pn-i”>-

Таким образом, отношение безопасности с индексом ‘У’ определяет продолжение истории кнопкой, не вызывающей разрушение, а отношение безопасности с индексом дополнительно запрещает тупик и попытку выхода из выполняемой дивергенции. Понятно, что 1-безопасная кнопка также и 2-безопасна, но обратное, вообще говоря, не верно. Для полной безопасности кнопки после истории требуется, чтобы она была 2-безопасна, и если она не 1-безопасна, то после неё можно было разместить конечную (в том числе пустую) цепочку 2-безопасных кнопок, а затем 1-безопасную кнопку, гарантирующую наблюдение.

На основе отношений безопасности кнопок в реализации и спецификации определяются безопасные действия, безопасные истории, гипотеза о безопасности и безопасная конформность аналогично тому, как это делалось для случая без переключения кнопок. Для п=1,2:

I safe for S =def (<y)gF(S) =s> <y)gF(I))

& eSafe Ну (S) rSafeln (I) VPeP (P safenby S after ст => P safe„in I after ст);

I saco S =def I safe for S

& \/neSafeHy (S) r,Safeín (I) VP safenby S after ст obs (ст, P, I) cobs (ст, P, S).

Итак, мы определили безопасность и конформность для Р-семантики с приоритетами в двух модификациях: с переключением и без переключения кнопок. Очевидно, что Р-семантика без приоритетов является частным случаем Р-семантики с приоритетами, когда предикаты всех переходов тождественно истинны. При этом не важно, рассматривается семантика с переключением или без переключения кнопок.

3.8. Параллельная композиция и генерация тестов

Рассмотрим композицию двух LTS с приоритетами I и Т в алфавитах А и В соответственно. Возьмём любое композиционное состояние it. При композиции множество разрешённых внешних действий для LTS I в состоянии i - это множество противоположных внешних действий, по которым есть переходы из состояния t другой LTS Т, и наоборот. Поэтому, прежде всего, нам нужно пересчитать предикаты переходов из этих состояний. В силу коммутативности оператора композиции (с точностью до изоморфизма, то есть именования состояний it или ti), нам достаточно рассмотреть только пересчёт предикатов одной LTS, для определённости, LTS I. Пересчёт предикатов другой LTS делается аналогично. Для перехода

i—z, 7ii—>i ' мы должны в предикат 7г±, понимаемый как булевская функция от булевских переменных-действий, подставить константное значение каждой переменной, соответствующей синхронному действию zeAnB. Если есть переход t—>t', то подставляется значение true. иначе - false. Получается новый предикат nit. Заметим, что вычисление нового предиката на переходе из состояния i зависит от состояния t, с которым оно компонуется, то есть для разных состояний t будут, вообще говоря, разные предикаты nit.

Новый предикат nit может быть не константным, поскольку в нём могут остаться переменные, соответствующие асинхронным внешним действиям из А\В. Кроме того, теперь этот предикат следует понимать как предикат в композиционном алфавите А=^В= (А\В) и (В\А), хотя реально он не зависит от переменных, соответствующих действиям из В\А. (Предикат 7lti, наоборот, может зависеть от этих переменных, но не зависит от переменных, соответствующих действиям из А\ BJ

Асинхронный переход соответствует одному переходу в одном из LTS-операндов. Он может выполняться, если может выполняться наследуемый переход. Следовательно, предикат асинхронного композиционного перехода совпадает с предикатом наследуемого перехода после пересчёта, то есть не с исходным предикатом 7г±, а с предикатом nit. Синхронный переход - это одновременное выполнение переходов в каяедом LTS-операнде. Он может выполняться, если могут выполняться оба перехода-операнда. Следовательно, предикат синхронного композиционного перехода равен конъюнкции

пересчитанных переходов-операндов 7т ■ & 7т ■. В целом композиционные переходы порождаются следующими правилами вывода:

(1) Z6 (Au{x,y} ) \В & i-----------Z,7li—>i' □ it----Z , 7Ilt—>i ' t,

(2) Z6 (Bu{x,y} ) \A & t-----------z,71t—>t' □ it--------Z,7lti—»it',

(3) zeAnB & i-------Z,7li—>i' & t--z^,7lt—>t'D it-T,7llt&TIti—' t ' .

Как и в случае машины без приоритетов, тестирование понимается как композиция LTS-реализации I в алфавите А и LTS-теста Т в противоположном алфавите В=А. Мы также будем предполагать, что в тесте нет разрушения. Переходы в тесте не имеют предикатов, точнее, их предикаты константно истинны. Поэтому в композиционной LTS все переходы (а это уже только х- и у-переходы) - это пересчитанные предикаты переходов реализации. Поскольку композиционный алфавит пуст, эти предикаты константны (true или false).

Если нет переключения кнопок, то в тесте нет х-переходов. Точнее, такой переход может быть только в состоянии, соответствующем отсутствию нажатой кнопки: t—х—> влечёт Vz^x t—z |. Оператор выжидает, прежде, чем нажать кнопку. Таких х-переходов из состояния t может быть несколько

- оператор выбирает, какую кнопку ему нажать. Заметим, однако, что наличие в тесте х-переходов только создаёт лишний нетедерминизм и не увеличивает мощности тестирования. Для обнаружения R-отказа R в тесте (но не в реализации!) используется переход по R-отказу аналогично случаю без приоритетов.

(4) VzeRu{x,y} fn п (Pq) & i—z,7i—>■ & t—R—>t' & t—x I □ i t—x—>i t', где Pq= { z e L | t—z-^>}.

Такому состоянию теста t соответствует кнопка P=PquPr, где Рг множество R -отказов R, для которых в состоянии определены переходы

t—R—».

Если допускается переключение кнопок, то в тесте оно отображается в виде х-перехода из состояния, соответствующего одной кнопке, в состояние, соответствующее другой кнопке. В этом случае нужно, чтобы R-переход мог срабатывать независимо от этого х-перехода. Иными словами, из правила вывода (4) удаляется условие, подчёркнутое волнистой линией.

В композиции реализации и теста все предикаты константны, и мы можем удалить все переходы с ложными предикатами. После этого при безопасном тестировании оставшиеся у-переходы должны быть недостижимы. Тогда, как и для машины без приоритетов, выполнению теста соответствует прохождение х-маршрута, начинающегося в начальном состоянии композиции и заканчивающегося в терминальном состоянии, которому назначен вердикт pass или fail.

Примитивный тест строится точно так же, как для машины без приоритетов. Отличие лишь в том, что без приоритетов мы строили тест по безопасной R-трассе, превращая её в одну из P-историй, а теперь сразу начинаем с некоторой безопасной P-истории. Кроме того, если в истории есть переключение с кнопки Р на кнопку Q, то в тесте проводится х-переход “Р”—х—»“Q”. По-прежнему, набор всех примитивных тестов полон, а любой управляемый строгий тест можно заменить на объединение примитивных тестов, которое обнаруживает те же самые ошибки.

3.9. Примеры задания приоритетов

Покажем, как задаются приоритеты с помощью предикатов на переходах LTS-модели для примеров, приведённых во введении.

Выход из дивергенции. Переход по внешнему действию имеет тождественно истинный предикат, а х-переход имеет предикат п, истинный только на пустом подмножестве алфавита внешних действий: п (U) = (и=0).

Выход из осцилляции (приоритет приёма над выдачей). Переход по стимулу имеет тождественно истинный предикат, а переход по реакции имеет предикат л, истинный на любом подмножестве действий, не содержащем стимулов: 7i(U) = (V?x ?xgU). Обычно также подразумевается, что внутренняя активность менее приоритетна, чем приём стимула, то есть х-переход имеет такой же предикат, как переход по реакции.

Приоритет выдачи над приёмом в неограниченных очередях. Переход по реакции имеет тождественно истинный предикат, а переход по стимулу имеет предикат 7г, истинный на любом подмножестве действий, не содержащем реакций: 7i(U) = (V!y !ygU). Обычно также подразумевается, что

внутренняя активность менее приоритетна, чем выдача реакции, то есть х-переход имеет такой же предикат, как переход по стимулу.

Прерывание цепочки действий. Переход по команде «отменить» (cancel) имеет тождественно истинный предикат, а все остальные переходы имеют предикат 7г, истинный на любом подмножестве действий, не содержащем “cancel”: 7г (и) = (cancelgu).

Приоритетная обработка входных воздействий. Множество стимулов разбивается на непересекающиеся подмножества Х1гХ2г... с линейным приоритетом: стимулы из подмножества с большим индексом имеют больший приоритет. Предикат 7г± на переходе по стимулу из истинен на любом подмножестве действий, не содержащем стимулов из подмножества с большим номером: 7ii(U) = (Vj>i Un,Z■ =0). Возможна также

дифференциация переходов из некоторого состояния по одному и тому же стимулу в зависимости от наличия или отсутствия менее приоритетных стимулов. Например, один переход по стимулу из Xi выполняется, если окружение предлагает менее приоритетные стимулы

71ц (и) =71! (и) & (3;]<1 иг',Х ). в предположении, что это предложение сохранится, и эти стимулы можно будет обработать потом, а другой переход выполняется, если менее приоритетных стимулов

7Г12 (и) =71! (и) & (V □ <1 иГ',Х'=0) нет. Если в состоянии нет переходов по стимулам, то такая дифференциация возможна и между переходами по реакциям и/или х-переходам.

Возможна реализация и более экзотических приоритетов. Например, циклический приоритет движения по сторонам света: идём на север, если нельзя идти на восток; идём на восток, если нельзя идти на юг; идём на юг, если нельзя идти на запад; идём на запад, если нельзя идти на север. Если разрешены все четыре направления, выбирается любое. Кроме этого случая, равноприоритетными оказываются только противоположные направления при отсутствии остальных. Предикат перехода на север выглядит так: Тссевер (и) = (востокуи V и= {север,восток,юг,запад}). Аналогично устроены предикаты переходов на восток, юг и запад.

3.10. «Торговля» между партнёрами при композиции

Композиция ЬТ8 с приоритетами основана на пересчёте предикатов переходов, ведущих из состояния 1 одного операнда, в зависимости от множества действий, разрешаемых соответствующим состоянием t другого операнда. Разрешаемое действие - это такое синхронное действие 2, для которого в состоянии t есть переход по противоположному действию ъ. Пересчитанный предикат может стать тождественно ложным, то есть переход с таким предикатом никогда не будет выполняться. Поэтому, если учитывать только те действия, по которым есть переходы с нетождественно ложными предикатами, пересчёт предикатов меняет множество действий, разрешаемых состоянием 1, что, в свою очередь, может повлиять на пересчёт предикатов в состоянии 1:. А тогда, в свою очередь, меняется множество действий, разрешаемых состоянием Ь, что требует нового пересчёта предикатов переходов в состоянии 1 и нового изменения множества действий, разрешаемых состоянием 1. И так далее. Этот процесс «торговли» между партнёрами может быть бесконечным или заканчиваться, если они «договорятся» придти к какому-то согласованному решению. Необходимость такой «торговли» и её реализацию с помощью х-переходов с предикатами мы покажем на нескольких примерах.

приоритет приёма над выдачей

Равноприоритетно сть приёма и выдачи

приоритет выдачи над приёмом

приоритет приёма над выдачей

{

Ai

?х. true ^^ -------------

Bi ! х, true

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

I

Ci

! x, true

?y, true

i

Di

!x, -п! у

? у , /ГНС'

Ai^Bi т, true

Аг^Сг X, true

Ai^Di О тупик

передача х

передача х

А2

?х, —1 (?х& ! у) -------------►#

В2

! х. true

?x,true -------►*

cz

? у, true

С2

!х, —, (!х&?у) -----------►#

D2

! х, -i (! х&?у)

! х, true

х, ?х& ! у

--------

! У, -1 (?х& ! у)

-------

х, ! х&?у

т, ! х&?у

О---------

?у,-.( !х&?у)

А2^В2

х, true

А2=ЛС2

т, true

---------

т, /г/«/

передача

т, true т, true

передача

{

A2^D2

i

X, true -И

т, true т, true

пер

х, true

пер

Рис. 7. Две стратегии приоритетности приёма над выдачей

(т-переходы с тождественно ложными предикатами не показаны)

Сначала рассмотрим ещё раз пример приоритета приёма над выдачей: переход по стимулу имеет тождественно истинный предикат, а переход по реакции

99

(или х-переход) имеет предикат, истинный на любом подмножестве действий, не содержащем стимулов. Если ЬТ8 с такими приоритетами готова выполнить как приём стимула ?х, так и выдачу реакции ! у, а её партнёр выполняет только выдачу ! х или только приём ? у, то однозначно определяется передача сообщения х из второй ЬТ8 в первую или, соответственно, сообщения у из первой ЬТ8 во вторую. Также, если партнёр готов как принимать ? у, так и выдавать ! х, но эти действия имеют имеют равные приоритеты, или выдача приоритетнее приёма, то в композиции будет гарантированно осуществляться передача сообщения х. Однако если обе ЬТ8 применяют одинаковую стратегию - приоритет приёма над выдачей, то возникнет тупик: каждый хочет принимать, но не хочет выдавать. Эта стратегия изображена на рис. 7 в строке 1. Если нас это не устраивает, необходима «торговля»: выяснив, что партнёр и принимает и выдаёт, мы должны только принимать, но не выдавать. Эта стратегии изображена на Рис. 7 в строке 2.

Аналогичные две стратегии возможны для симметричного примера приоритета выдачи на приёмом.

Теперь рассмотрим случай, когда задан циклический приоритет действий: если данное действие не может быть выполнено, то предпринимается попытка выполнить следующее по приоритету действие и так далее. (Нам будет безразлично, является ли действие передачей стимула, выдачей реакции или ещё каким-то действием.) На Рис. 8 в строке 1 показан пример, когда таких действий три: 0, 1 и 2 с приоритетами 0>1>2>0; начальное действие, с которого начинается торговля, - действие 0. Если партнёр придерживается аналогичной стратегии торговли, но начинает с действия 2, то при композиции возможен бесконечный цикл торговли. Чтобы его избежать, стратегия может быть скорректирована так, чтобы приоритеты перестали быть циклическими (строка 2): после того, как перебраны все действия и все они отклонены партнёром, принимается решение (показано пунктиром) «согласиться» на те действия, которые последний раз предлагал партнёр.

приоритеты: 0>1>2>0

Ai

В состоянии “i” определён переход по действию i с предикатом true.

приоритеты: 2>0>1>2

Bi

В состоянии “i” определён переход по действию л. с предикатом true.

Ai^Bi

A2^Bi = А2^В2

В состоянии “ii” определён синхронный т-переход (по действиям i и i) с предикатом true.

приоритеты: 0>1>2

А2

>о) I-0tl <Т)

т, —«0&—• 1

т,-.2&-.0 I т, —11 & —.2

т, -*1&2

приоритеты: 2>0>1 В2

>2) ^2 >(о)

Рис. 8. Две стратегии циклического приоритета (т-переходы с тождественно ложными предикатами не показаны).

В общем случае торговля выглядит следующим образом. Пусть в состоянии

системы Б определены переходы Б 2, 71—>3 ПО действиям с

нетождественно ложными предикатами п. Система «узнаёт», что в её полном окружении (которое имеет противоположный алфавит и с которым она образует замкнутую систему с пустым алфавитом) определены переходы с нетождественно ложными предикатами по множеству действий (¿0. После пересчёта предикатов в системе получается множество действий Рх, а в окружении - Ох. Пересчёт предикатов происходит недетерминированно в системе или в её окружении. Если сначала пересчитываются предикаты системы, то мы получаем пару множеств Рх, О0; в противном случае - пару Р0,01. Далее в первом случае происходит пересчёт предикатов в окружении, и мы получаем пару Р1,<2;з где 0_ пересчитано на основе Р . а во втором случае - в системе, и мы получаем пару Р^Оь где Р пересчитано на основе <2!. И так далее (см. рис. 9 слева).

На каждом шаге у нас есть пара множеств Р1л 01+1 или Р , О'. В первом случае следующий пересчёт происходит в системе и следующая пара - это Р ■ . ■, 01+1; во втором случае следующий пересчёт происходит в окружении и следующая пара - это Рц-1,0ц-2. Торговля заканчивается, когда множество при пересчёте не меняется: при переходе от пары Р±, <21+1 к паре Р ■ , Qi+1,

если Р 1+2=Р 1, или при переходе от пары Р ,0 к паре Р' , 0' . если 01+2=01-

Моделирование такой торговли с помощью т-переходов с предикатами может быть выполнено следующим образом (см. рис. 9 справа). Мы будем использовать переходы по множеству разрешаемых действий: —z, Q —> означает переход —z, п—> по предикату л, который истинен только на множестве Qi: п (Q) = (Q=Qi). Состояние s преобразуется во множество состояний si. Сначала имеем состояние s0, в котором определены переходы s0—z f fulse—>s по внешним действиям zeP„ с тождественно ложными предикатами, а также т-переход s0—т, Q —>s по множеству разрешаемых действий Q о. Такой т-переход, естественно, необходимо иметь для каждого Q о. В конце т-перехода находится состояние s . соответствующее множеству действий Pi, которое получается после пересчёта предикатов по множеству

Qо. В ЭТОМ СОСТОЯНИИ определяются переходы Si---Z, Qñ—>s:i„ по действиям

из zePi по множеству Qо. Также в состоянии 1 определяется т-переход si—т, Q—>s- по множеству разрешаемых действий Q ^Q (для каждого такого Qi). В конце этого второго т-перехода находится состояние s . соответствующее множеству действий Р2, которое получается после пересчёта предикатов по множеству Qx. В этом состоянии определяются переходы s2—z,Qi—>s:i„ по действиям zеР по множеству Qi. Также в состоянии 2 определяется т-переход S 2—t,Q—>s по множеству разрешаемых действий Q (для каждого такого Q ). И так далее.

Естественно, для конкретной стратегии торговли какие-то из этих состояний могут отождествляться. Если возникает бесконечная цепочка х-переходов (в частности, цикл), то такая дивергенция соответствует «зацикливанию» при торговле.

4. Заключение

Можно рассматривать семантики, в которых при включении машины, после наблюдения и при переключении кнопок может не допускаться выполнение реализацией х- и у-переходов, даже если они 0-выполнимы. Можно считать, что сразу после включения машины и сразу после наблюдения машина стоит, и может выполнять какие-то действия только после нажатия кнопки. Также переключение кнопок не интерпретируется как отжатие первой кнопки (с разрешением 0-выполнимых х- и у-действий), а потом нажатие второй кнопки. Иными словами, после включения машины, после наблюдения и между двумя кнопками при переключении кнопок нет никакого «пустого» промежутка. Такая семантика, очевидно, предполагает более сильные тестовые возможности, чем слабая семантика, рассматриваемая в данной статье. Эти семантики имеют разные требования по безопасности и конформности.

Любое поведение, которое можно наблюдать при сильной семантике можно наблюдать и при слабой семантике: достаточно подобрать подходящие погодные условия, когда оператор успевает нажать или переключить кнопку достаточно быстро. Верно и обратное: поведение при слабой семантике наблюдается при сильной семантике, если добавить пустую кнопку и явно нажимать её. Однако условия безопасности для этих семантик разные. При слабой семантике мы всегда должны рассчитывать на возможность выполнения х- и у-действий (при наличии приоритетов, они должны быть 0-выполнимы) после наблюдения по кнопке Р, а такие действия могут давать дивергенцию или разрушение; тем самым, кнопка Р будет опасной. При сильной семантике мы можем просто не нажимать в этой ситуации пустую кнопку после такого наблюдения, поскольку она опасна, а кнопка Р будет безопасной. Отсюда же вытекают и соответствующие различия в конформности: реализация может быть опасной при слабой семантике и, следовательно, не конформной, но безопасной и конформной при сильной семантике. При тех же условиях безопасности (например, когда в спецификации нет дивергенции, разрушения и ненаблюдаемых отказов) и при наличии приоритетов сильная семантика предъявляет более жёсткие условия конформности. Эго объясняется тем, что мы получаем возможность различать реализации, в которых некое действие Ь, разрешаемой кнопкой В, выполняется сразу после действия а или через промежуточную 0-выполнимую, но не В-выполнимую х-активность.

Кроме генерации тестов, важнейшей проблемой теории конформности является проблема монотонности - сохранения конформности при композиции. В общем случае композиция реализаций, конформных своим спецификациям, может быть не конформна композиции этих спецификаций. Частным, но важным, случаем этой проблемы является проблема асинхронного тестирования, когда имеется два компонента: реализация и известная среда передачи. Здесь также композиция конформной реализации со средой может быть не конформна композиции спецификации с этой средой.

Для R/Q-семантики без приоритетов эта проблема решается с помощью, так называемого, монотонного преобразования спецификаций: композиция

конформных реализаций оказывается конформной композиции преобразованных спецификаций. Или, для асинхронного тестирования: композиция конформной реализации со средой конформна композиции преобразованной спецификации с этой средой. Монотонное преобразование выполняется для R/Q -семантик, в которых все отказы наблюдаемы, то есть Q=0. В общем случае R/Q-семантики сначала выполняется, так называемое, пополнение спецификации. Пополненная спецификация эквивалентна (имеет тот же класс безопасных и тот же класс конформных реализаций) исходной спецификации в R/Q-семантике, а кроме того, эквивалентна сама себе в RuQ/0-семантике. Пополнение решает также проблему рефлексивности («самоприменимости») спецификации, которая в R/Q-семантике может быть не конформна сама себе. Тем самым, совокупность преобразования пополнения и монотонного преобразования решает общую проблему монотонности и рефлексивности для любой R/Q-семантики [4,6,7].

Для R/Q-семантик с приоритетами проблемы монотонности и рефлексивности ещё не решены. Также эти проблемы не решены в общем случае Р-семантики: как с приоритетами, так и без них..

Литература

[1] Бурдонов И.Б., Косачев А.С. Тестирование компонентов распределенной системы. Труды Всероссийской научной конференции «Научный сервис в сети ИНТЕРНЕТ», Изд-во МГУ, 2005

[2] Бурдонов И.Б., Косачев А.С. Верификация композиции распределенной системы. Труды Всероссийской научной конференции «Научный сервис в сети ИНТЕРНЕТ», Изд-во МГУ, 2005

[3] Bourdonov I., Kossatchev A., Kuliamin V. Formai Conformance Testing of Systems with Refused Inputs and Forbidden Actions. Proc. Of МВТ 2006, Vienna, Austria, March 2006

[4] Бурдонов И.Б., Косачев A.С., Кулямин В.В. Формализация тестового эксперимента. «Программирование», 2007, No. 5

[5] Бурдонов И.Б., Косачев А.С., Кулямин В.В. Безопасность, верификация и теория конформности. Материалы Второй международной научной конференции по проблемам безопасности и противодействия терроризму, Москва, МНЦМО, 2007

[6] Бурдонов И.Б., Косачев А.С., Кулямин В.В. Теория соответствия для систем с блокировками и разрушением. «Наука», 2008

[7] Бурдонов И.Б. Теория конформности для функционального тестирования программных систем на основе формальных моделей. Диссертация на соискание учёной степени д.ф.-м.н., Москва, 2007

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

http://www.ispras.ru/4iedVerst/RedVerst/Publications/TR-01-2007.pdf

[8] Бурдонов И.Б., Косачев А.С. Системы с приоритетами: конформность, тестирование, композиция. Труды ИСП РАН, т. 14, 2008

[9] van Glabbeek R. J. The linear time - branching time spectrum. In J.C.M. Baeten and J.W. Klop, editors, CONCUR’90, Lecture Notes in Computer Science 458, Springer-Verlag, 1990, pp 278-297

[10] van Glabbeek R.J. The linear time - branching time spectrum II; the semantics of sequential processes with silent moves. Proceedings CONCUR ’93, Hildesheim, Germany, August 1993 (E. Best, éd.), LNCS 715, Springer-Verlag, 1993, pp. 66-81

[11] Heerink L., Tretmans J. Refusal Testing for Classes of Transition Systems with inputs and Outputs. In T.Mizuno, N.Shiratori, T.Higashino, A.Togashi, eds. Formal Description Techniques and Protocol Specification, Testing and Verification. Chapman

& Hill, 1997

[12] Heerink L. Ins and Outs in Refusal Testing. PhD thesis, University of Twente, Enschede, The Netherlands, 1998

[13] Lestiennes G., Gaudel M.-C. Test de systèmes reactifs non receptifs. Journal Europeen des Systèmes Automatises, Modélisation des Systèmes Reactifs, pp. 255-270. Hermes, 2005

[14] Milner R. A Calculus of Communicating Processes. LNCS, vol. 92, Springer-Verlag, 1980.

[15] Milner R. Modal characterization of observable machine behaviour. In G. Astesiano & C. Bohm, editors: Proceedings СААР 81, LNCS 112, Springer, pp. 25-34

[16] Milner R. Communication and Concurrency. Prentice-Hall, 1989

i Надоели баннеры? Вы всегда можете отключить рекламу.