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