Конечные автоматы

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

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

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

Рис. 17 Структурная схема тестируемого конечного автомата

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

Так, такой тестирующий автомат будет иметь три состояния – «Начальное», «Передача данных» и «Обработка ошибки». При переходе из начального состояния в состояние «Передача данных» он передает сообщение «Начало данных», в состоянии «Передача данных» он будет передавать блоки данных, описанные в тестовом примере, в т.ч. возможно, ошибочные. При получении сообщения «Возникла ошибка» автомат перейдет в состояние «Обработка ошибки» из которого перейдет в начальное состояние передав сообщение «Ошибка обработана». В начальное состояние тестирующий автомат может перейти и в случае завершения последовательности блоков данных, описанных в тестовом примере, в этом случае при переходе он пошлет сообщение «Конец данных». Структурная схема такого автомата показана на Рис. 18.

Рис. 18 Структурная схема тестирующего конечного автомата

Далее приведен пример определения этого тестирующего автомата в тест-плане. Оно будет выглядеть следующим образом:

STATES DEFINITION:

State1=Начальное

State2=Передача данных

State3=Обработка ошибки

PASS DEFINITION

Pass1=State1->State2 with function call BeginData(Param1)

Pass2=State2->State2 with function call SendData(Param1)

….

Pass5=State2->State3 external with function call ErrorReceived(Message)

В разделе STATES DEFINITON определены все состояния тестирующего автомата, в разделе PASS DEFINITION – переходы между состояниями. Переход из состояния M в состояние N определяется выражением StateN->StateM. При переходе вызывается функция тестового драйвера, имя которой записывается после строки with function call. Если в функцию должны быть переданы параметры, их имена указываются в скобках. Если какой-либо переход должен происходить при получении внешнего сообщения, это обозначается ключевым словом external. При этом вызывается функция, обрабатывающая полученное сообщение

Тестовые примеры для тестирования конечного автомата будут выглядеть следующим образом:

TESTCASE 1

Data:

begBlock=\027

sndBlock[0]=’H’

sndBlock[1]=’i’

errBlock=0

Scenario:

Pass1(begBlock)

Pass2(sndBlock[0])

Pass2(sndBlock[1])

Pass2(errBlock)

Pass5(message)

В этом примере в секции Data определяются данные для сообщений, передаваемых автоматом, а в секции Scenario – последовательность переходов по состояниям с передаваемыми данными.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: