На основании тест-требований составляются тест-планы - программы испытаний (проверки, тестирования) программной реализации системы. В отличие от тест-требований в тест-плане описываются конкретные способы проверки функциональности системы, т.е. то, как должна проверяться функциональность. Как правило, тест-план состоит из отдельных тестовых примеров, каждый из которых проверяет некоторую функцию или набор функций системы. Для каждого тестового примера однозначно определяется критерий успешного прохождения ( pass/fail criteria ), при помощи которого можно судить - соответствует ли поведение системы заданному в требованиях или нет (Рис 11.1).
(рис 11.1) Место тест-планов среди проектной документацииКритерием качества тест-плана является покрытие (выполнение) всех требований к проверке правильности функционирования программной реализации. Желательной характеристикой тест-плана является проверка исполнения всех веток схемы программной реализации.
Структура тест-плана может соответствовать структуре тест-требований или следовать логике внешнего поведения системы. Каждый пункт тест-плана описывает, как производится проверка правильности функционирования программной реализации, и содержит:
В состав тест-плана рекомендуется дополнительно включать пункты, которые служат для проверки ветвей программы, не выполнявшихся при проверке удовлетворения функциональных требований. Такие пункты тест-плана могут иметь указание "Для полноты покрытия" в поле ссылки.
Тест-план может готовиться в формализованной форме и служить входным документом для тестовой оснастки, по которому тесты будут выполняться в автоматическом режиме с автоматической фиксацией результатов. В случае, если тест-план готовится в виде текстового документа, возможно только ручное тестирование системы по данному тест-плану.
Форма представления тест-плана в первую очередь зависит от того, каким образом тест-план будет использоваться в процессе тестирования. При ручном тестировании удобно представление тест-планов в виде текстовых документов, в которых отдельные разделы представляют собой описания тестовых примеров. Каждый тестовый пример в таком случае включает в себя перечисление последовательности действий, которые необходимо выполнить тестировщику для проведения тестирования - сценария теста, а также ожидаемые отклики системы на эти действия. Такая форма представления тест-плана неудобна для
Для автоматизированного тестирования сценарий теста может записываться на каком-либо формальном языке, в этом случае возможно непосредственное использование тест-планов как входных данных для среды тестирования.
Другой формой представления тест-планов является таблица. Эта форма наиболее часто используется при четко и формально определенных входных потоках данных системы. Например, каждый столбец таблицы может представлять собой тестовый пример, каждая строка - описание входного потока данных, а в ячейке таблицы записывается передаваемое в данном тестовом примере в данный поток значение. Ожидаемые значения для данного теста записываются в аналогичной таблице, в которой в строках перечисляются выходные потоки данных.
И, наконец, третьей формой представления тестовых примеров является определение примеров в виде конечного автомата. Такая форма представления используется при тестировании протоколов связи или программных модулей, взаимодействие которых с внешним миром производится при помощи обмена сообщениями по заранее заданному интерфейсу. Модуль при этом может быть представлен как конечный автомат с набором состояний, а тест-план будет состоять из двух частей - описания переходов между состояниями и их параметров и тестовых примеров, в которых задается маршрут перехода между состояниями, параметры переходов и ожидаемые значения. Такое представление тест-плана может быть пригодно как для ручного, так и для автоматизированного тестирования.
Представление сценариев, удобное для
Подразумевается, что действия сценария должны быть описаны таким образом, чтобы их мог воспроизвести человек практически с любым уровнем подготовки. Описание ожидаемой реакции системы должно также быть записано таким образом, чтобы можно было однозначно судить - соответствует реакция ожидаемой или нет.
Так, неудачной ожидаемой реакцией при ручном тестировании была бы запись
Сообщение "Загрузка" пропадает через приемлемое время
Степень приемлемости здесь будет зависеть от терпеливости тестировщика, и обеспечить повторяемость тестирования будет затруднительно. Более удачной формой описания той же самой ожидаемой реакции будет
Сообщение "Загрузка" исчезает с экрана не более, чем через 10 секунд после появления.
Ниже приведен пример описания тестового примера в виде сценария, предназначенного для
Группа тестов: Работа с учетными записями Тестовый пример: 1289-15 Назначение: Проверка того, что учетная запись пользователя проверяется перед началом передачи данных и в случае ввода записи по умолчанию при максимальной защите системы передачи не происходит. Тест-требования: 8.5.8.1, 8.5.8.2 Предусловия для теста: Система должна быть приведена в состояние "Максимальная защита" и сброшена в настройки по умолчанию. Критерий прохождения теста: Все ожидаемые значения совпадают с реальными.
| № | Шаг сценария | Ожидаемый результат |
|---|---|---|
| 1 | Запустить терминальный клиент и соединиться с системой по адресу 127.0.0.1 | Должно появиться приглашение терминала TRANSFER> |
| 2 | Запустить процесс передачи данных при помощи ввода команды SEND DATA |
Должно появиться приглашение и следующими двумя строкамиEnter your credentials… Login: |
| 3 | Ввести имя учетной записи default |
Должна появиться строка Password: |
| 4 | Ввести пароль default |
Должно появиться сообщениеDefault user blocked - system set to High securityи соединение с терминалом должно быть прервано |
Как можно видеть, такая форма представления действительно неудобна для
Сценарии тестирования для автоматического тестирования часто описывают на том или ином языке программирования. Например, методы в тестирующих классах Microsoft Visual Studio Team Edition представляют собой именно пошаговые описания действий, которые необходимо выполнить тестовому окружению для проведения тестирования. Возможна и более близкая к естественному языку форма подготовки тестовых примеров. Например, при тестировании логической функции с уровнем покрытия MC/DC и описании тестовых примеров на одном из диалектов Visual Basic Script возможно записать сценарий тест-плана в такой форме:
'---------------------------------------------------------------- ' TEST CASES '---------------------------------------------------------------- ' 8 testcases ' 1 2 3 4 5 6 7 8 ' ----------------------------------------------- ' computed - - 0 0 0 - - - ' good1 0 1 0 0 0 0 0 0 ' computed2 - - - - 0 - - - ' good2 1 1 1 0 0 1 1 1 ' delay - - - - - 0 - - ' pack1 1 1 1 1 1 1 0 0 ' pack2 0 0 0 0 0 0 0 1 ' ----------------------------------------------- ' output_message 1 0 0 1 0 0 0 1 '------------------------------------------------------------------- ' Testcase #1: Call Test_Message_Call (-, 0, -, 1, -, 1, 0, 1) '------------------------------------------------------------------- ' Testcase #2: Call Test_Message_Call (-, 1, -, 1, -, 1, 0, 0) '------------------------------------------------------------------- ' Testcase #2: Call Test_Message_Call (0, 0, -, 1, -, 1, 0, 0) '-------------------------------------------------------------------' Testcase #4: Call Test_Message_Call (0, 0, -, 0, -, 1, 0, 1) '-------------------------------------------------------------------' Testcase #5: Call Test_Message_Call (0, 0, 0, 0, -, 1, 0, 0) '-------------------------------------------------------------------' Testcase #6: Call Test_Message_Call (-, 0, -, 1, 0, 1, 0, 0) '-------------------------------------------------------------------' Testcase #7: Call Test_Message_Call (-, 0, -, 1, -, 0, 0, 0) '-------------------------------------------------------------------' Testcase #8: Call Test_Message_Call (-, 0, -, 1, -, 0, 1, 1)
При такой форме представления сценарий каждого тестового примера состоит из последовательности вызовов функций (в данном случае функция всего одна), которые передают данные в среду тестирования.
Как уже говорилось выше, табличное представление тестов удобно при четко формализованных входных и выходных потоках данных системы. Например, в предыдущем фрагменте тест-плана в комментариях приведена таблица, в которой по вертикали указаны имена входных потоков данных системы, по горизонтали приведены номера тестовых примеров, а в ячейках на их пересечении приведены значения. Выходные значения приводятся в том же формате ниже:
' 1 2 3 4 5 6 7 8 ' ----------------------------------------------- ' computed - - 0 0 0 - - - ' good1 0 1 0 0 0 0 0 0 ' computed2 - - - - 0 - - - ' good2 1 1 1 0 0 1 1 1 ' delay - - - - - 0 - - ' pack1 1 1 1 1 1 1 0 0 ' pack2 0 0 0 0 0 0 0 1 ' ----------------------------------------------- ' output_message 1 0 0 1 0 0 0 1
Табличное представление, как правило, используется для упрощения работы по подготовке и сопровождению большого количества однотипных тестов. Среда тестирования, применяющая табличное описание тестовых примеров, в качестве входных данных включает в себя
В случае, когда однотипными являются не только входные и выходные данные, но и их значения, может использоваться альтернативная форма представления табличных данных. Тестовые примеры в ней также нумеруются по горизонтали, а входные потоки данных - по вертикали. Однако, под каждым из потоков данных перечисляются возможные входные значения, а факт того, что это входное значение должно быть передано в данном тестовом примере, отмечается помещением специальной метки (например, символа X ) на пересечении значения и тестового примера в таблице:
+-------------+ INPUTS: | a b c d e f | ----------------------------+-------------+ Power_On_Mode | COLD | X X X WARM | X X X Configuration_Store_Id | 0xFFFD | X X X X X X IR_Access_Mode | 1 | X X X X 0 | X 0xFFFF | X Reset_Mode | 0 | X X X X X X Reset_Source | 0 | X X 1 | X 2 | X X X
При интерпретации каждого такого тестового примера он преобразуется в последовательность команд, которые выполняются средой тестирования. Например, для тестового примера a:
Power_On_Mode = COLD Configuration_Store_Id = 0xFFFD IR_Access_Mode = 1 Reset_Mode = 0 Reset_Source = 1 Run_Test()
Последняя команда здесь запускает тест на выполнение с установленными входными данными.
Форма подготововки тест-планов в виде описания конечных автоматов удобна при тестировании программных модулей или систем, поведение которых также может быть описано в виде конечного автомата. В этом случае процесс тестирования представляет собой обмен сообщениями между двумя конечными автоматами, изменяющими свое состояние в процессе обмена. Критерием полноты такого тестирования будет достижимость всех состояний тестируемой системы всеми возможными способами.
Описание тест-планов в виде конечного автомата обычно состоит из двух частей: определения самого тестирующего конечного автомата и определения сценариев перехода между состояниями - тестовых примеров.
Рассмотрим такой тест-план на следующем примере. Пусть тестируемый модуль представляет собой простой конечный автомат с тремя состояниями - "Начальное", "Прием данных" и "Ошибка". Автомат начинает свою работу в начальном состоянии, из которого может быть переведен в состояние "Прием данных" по получении сообщения "Начало данных". Он может переходить из этого состояния в него же по получению каждого следующего правильного блока данных, в состояние "Ошибка" по получении неверного блока данных или в начальное состояние по получению сообщения "Конец данных". При переходе в состояние "Ошибка" он передает сообщение "Возникла ошибка". Из состояния "Ошибка" он может переходить в начальное состояние по получении сообщения "Ошибка обработана".
Структурная схема такого автомата показана на Рис 11.2.
(рис 11.2) Структурная схема тестируемого конечного автоматаТестирующий конечный автомат должен уметь посылать все воспринимаемые тестируемым автоматом сообщения и воспринимать все посылаемые им сообщения. При этом целью тестирования будет проведение тестируемого автомата по всем состояниям всеми возможными способами. Один из возможных вариантов построения тестирующего автомата заключается в построении автомата с эквивалентными состояниями. Управление таким автоматом в основном будет проводиться при помощи описаний тестовых примеров, а не при помощи сообщений извне.
Так, такой тестирующий автомат будет иметь три состояния - "Начальное", "Передача данных" и "Обработка ошибки". При переходе из начального состояния в состояние "Передача данных" он передает сообщение "Начало данных", в состоянии "Передача данных" он будет передавать блоки данных, описанные в тестовом примере, в т.ч., возможно, ошибочные. При получении сообщения "Возникла ошибка" автомат перейдет в состояние "Обработка ошибки", из которого перейдет в начальное состояние, передав сообщение "Ошибка обработана". В начальное состояние тестирующий автомат может перейти и в случае завершения последовательности блоков данных, описанных в тестовом примере, в этом случае при переходе он пошлет сообщение "Конец данных".
Структурная схема такого автомата показана на Рис 11.3.
(рис 11.3) Структурная схема тестирующего конечного автоматаДалее приведен пример определения этого тестирующего автомата в тест-плане. Оно будет выглядеть следующим образом:
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 - последовательность переходов по состояниям с передаваемыми данными.
При тестировании конечных автоматов при помощи обычных тестирующих классов можно использовать аналогичный подход.
В некоторых случаях для упрощения процедуры тестирования используются специальные инструментальные средства, автоматически генерирующие тестовые примеры. Эти системы различаются по используемым методам генерации тестовых примеров, а получаемые тестовые примеры различаются по областям применимости.
Различают следующие способы генерации тестовых примеров:
Первый способ генерации тестовых примеров приемлем для тестирования системы как "черного ящика", но требует, чтобы тест-требования (или системные/функциональные требования) были подготовлены на специальном формальном языке оформления требований, например,
К сожалению, этот путь достаточно трудоемок и экономия времени от автоматической генерации тестов зачастую сводится на нет необходимостью в выделении дополнительного времени на перевод всех требований в формальную форму. В связи с этим рекомендуется применять данный метод только для тестирования систем, требования на которые могут быть сравнительно легко формализованы с использованием того или иного языка - например, системы поддержки коммуникационных протоколов.
Второй метод генерации тестовых примеров - на основе случайных данных. В этом случае не может идти и речи о систематизированном тестировании и гарантиях качества системы. Такой подход может применяться только при необходимости проверить поведение системы в случае передачи в нее большого количества неверных данных или определить количественные параметры поведения системы под большой нагрузкой.
Третий метод тестирования основан на анализе исходных текстов системы и построения тестов, которые выполняют каждое логическое условие и каждый оператор системы. В результате достигается очень высокий уровень покрытия программного кода. Однако, в этом случае тесты проверяют не то, что система должна делать в соответствии с требованиями, а то, как она делает уже запрограммированное. Перед тестировщиком в этом случае стоит задача анализа программного кода системы на соответствие требованиям, что зачастую представляет собой задачу не менее сложную, чем ручное написание тестов для проверки требований. Обычно рекомендуется вначале написать все тесты по требованиям, а затем, в случае необходимости, воспользоваться генератором тестов по программному коду. При этом целью использования генератора будет не достижение максимально возможного покрытия любой ценой, а анализ причин непокрытия при выполнении тестов требований и, в случае необходимости, коррекции требований.
Отчеты о прохождении тестов - основной (а иногда единственный) источник для заключения о соответствии протестированной системы требованиям. После выполнения всех тестов, описанных в тест-планах, среда тестирования создает отчет о том, насколько успешно система выполнила эти тесты. Такой отчет как минимум содержит информацию о каждом выполненном тестовом примере (его идентификатор) и результат его выполнения - успех или неудача.
По результатам анализа отчетов о прохождении тестов могут быть выявлены либо дефекты в самой системе, либо некорректно составленные или противоречивые требования. В обоих случаях результаты анализа служат основой для создания запросов на изменение требований и/или кода системы. После корректного исправления дефектов при регрессионном тестировании неуспешно выполненные тестовые примеры должны выполниться успешно (Рис 11.4).
(рис 11.4) Генерация отчета о прохождении тестов и изменения по результатам его анализаОтчеты о прохождении тестов могут служить основой для отслеживания состояния проекта: если с течением времени количество обнаруживаемых дефектов (неуспешно выполненных тестовых примеров) падает при условии сохранения качества тестирования - это свидетельствует о повышении качества разрабатываемой системы. С другой стороны, при внесении значительных изменений в систему количество дефектов неизбежно возрастает. Таким образом, идеальный график зависимости количества дефектов от времени похож на синусоиду с уменьшающейся амплитудой на каждом полупериоде.
В предыдущих лекциях уже приводилось несколько примеров отчетов о выполнении тестовых примеров, однако ранее основной уклон делался в сторону общей статистики выполнения тестов.
В стандарте IEEE 829 отчет о прохождении тестов разделен на три различных документа и описан в разделах 9 (
Заголовочная часть отчета о прохождении тестов служит для идентификации отчета и протоколирования того, какая часть разрабатываемой системы подвергалась тестированию, какая ее версия, какая конфигурация тестового стенда использовалась для выполнения тестов.
В заголовочную часть отчета о выполнении тестов обычно включается следующая информация:
Ниже показаны два примера таких заголовочных частей отчета, создаваемых различными инструментальными средствами. Красными цифрами в скобках обозначены соответствующие пункты приведенного выше списка.

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


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

Часто в отчет о выполнении тестов кроме количественной статистики помещают раздел с подробным объяснением причин неуспешно пройденных тестовых примеров. Каждый пункт такого объяснения обычно содержит следующую информацию:
Данный раздел может служить основой для создания отчетов о проблемах либо частично заменять их.
Пример такого раздела приведен ниже:
Некоторые тестовые примеры не могут быть выполнены в автоматическом режиме и поэтому требуют ручной работы тестировщика по их выполнению. Результаты выполнения ручных тестовых примеров могут заноситься в тот же самый документ, что и результаты выполнения автоматических тестовых примеров. Особенно часто это делается в случае, если и автоматические, и ручные тесты проверяют одну и ту же функциональную часть тестируемой системы. В этом случае при генерации отчета о прохождении тестов для ручных тестов генерируется форма, в которую тестировщик заносит данные о результатах проведенного им
Ниже приведен пример заполненной формы для
На основании тест-требований составляются тест-планы - программы испытаний (проверки, тестирования) программной реализации системы. В отличие от тест-требований в тест-плане описываются конкретные способы проверки функциональности системы, т.е. то, как должна проверяться функциональность. Как правило, тест-план состоит из отдельных тестовых примеров, каждый из которых проверяет некоторую функцию или набор функций системы. Для каждого тестового примера однозначно определяется критерий успешного прохождения ( pass/fail criteria ), при помощи которого можно судить - соответствует ли поведение системы заданному в требованиях или нет (Рис 11.1).
(рис 11.1) Место тест-планов среди проектной документацииКритерием качества тест-плана является покрытие (выполнение) всех требований к проверке правильности функционирования программной реализации. Желательной характеристикой тест-плана является проверка исполнения всех веток схемы программной реализации.
Структура тест-плана может соответствовать структуре тест-требований или следовать логике внешнего поведения системы. Каждый пункт тест-плана описывает, как производится проверка правильности функционирования программной реализации, и содержит:
В состав тест-плана рекомендуется дополнительно включать пункты, которые служат для проверки ветвей программы, не выполнявшихся при проверке удовлетворения функциональных требований. Такие пункты тест-плана могут иметь указание "Для полноты покрытия" в поле ссылки.
Тест-план может готовиться в формализованной форме и служить входным документом для тестовой оснастки, по которому тесты будут выполняться в автоматическом режиме с автоматической фиксацией результатов. В случае, если тест-план готовится в виде текстового документа, возможно только ручное тестирование системы по данному тест-плану.
Форма представления тест-плана в первую очередь зависит от того, каким образом тест-план будет использоваться в процессе тестирования. При ручном тестировании удобно представление тест-планов в виде текстовых документов, в которых отдельные разделы представляют собой описания тестовых примеров. Каждый тестовый пример в таком случае включает в себя перечисление последовательности действий, которые необходимо выполнить тестировщику для проведения тестирования - сценария теста, а также ожидаемые отклики системы на эти действия. Такая форма представления тест-плана неудобна для
Для автоматизированного тестирования сценарий теста может записываться на каком-либо формальном языке, в этом случае возможно непосредственное использование тест-планов как входных данных для среды тестирования.
Другой формой представления тест-планов является таблица. Эта форма наиболее часто используется при четко и формально определенных входных потоках данных системы. Например, каждый столбец таблицы может представлять собой тестовый пример, каждая строка - описание входного потока данных, а в ячейке таблицы записывается передаваемое в данном тестовом примере в данный поток значение. Ожидаемые значения для данного теста записываются в аналогичной таблице, в которой в строках перечисляются выходные потоки данных.
И, наконец, третьей формой представления тестовых примеров является определение примеров в виде конечного автомата. Такая форма представления используется при тестировании протоколов связи или программных модулей, взаимодействие которых с внешним миром производится при помощи обмена сообщениями по заранее заданному интерфейсу. Модуль при этом может быть представлен как конечный автомат с набором состояний, а тест-план будет состоять из двух частей - описания переходов между состояниями и их параметров и тестовых примеров, в которых задается маршрут перехода между состояниями, параметры переходов и ожидаемые значения. Такое представление тест-плана может быть пригодно как для ручного, так и для автоматизированного тестирования.
Представление сценариев, удобное для
Подразумевается, что действия сценария должны быть описаны таким образом, чтобы их мог воспроизвести человек практически с любым уровнем подготовки. Описание ожидаемой реакции системы должно также быть записано таким образом, чтобы можно было однозначно судить - соответствует реакция ожидаемой или нет.
Так, неудачной ожидаемой реакцией при ручном тестировании была бы запись
Сообщение "Загрузка" пропадает через приемлемое время
Степень приемлемости здесь будет зависеть от терпеливости тестировщика, и обеспечить повторяемость тестирования будет затруднительно. Более удачной формой описания той же самой ожидаемой реакции будет
Сообщение "Загрузка" исчезает с экрана не более, чем через 10 секунд после появления.
Ниже приведен пример описания тестового примера в виде сценария, предназначенного для
Группа тестов: Работа с учетными записями Тестовый пример: 1289-15 Назначение: Проверка того, что учетная запись пользователя проверяется перед началом передачи данных и в случае ввода записи по умолчанию при максимальной защите системы передачи не происходит. Тест-требования: 8.5.8.1, 8.5.8.2 Предусловия для теста: Система должна быть приведена в состояние "Максимальная защита" и сброшена в настройки по умолчанию. Критерий прохождения теста: Все ожидаемые значения совпадают с реальными.
| № | Шаг сценария | Ожидаемый результат |
|---|---|---|
| 1 | Запустить терминальный клиент и соединиться с системой по адресу 127.0.0.1 | Должно появиться приглашение терминала TRANSFER> |
| 2 | Запустить процесс передачи данных при помощи ввода команды SEND DATA |
Должно появиться приглашение и следующими двумя строкамиEnter your credentials… Login: |
| 3 | Ввести имя учетной записи default |
Должна появиться строка Password: |
| 4 | Ввести пароль default |
Должно появиться сообщениеDefault user blocked - system set to High securityи соединение с терминалом должно быть прервано |
Как можно видеть, такая форма представления действительно неудобна для
Сценарии тестирования для автоматического тестирования часто описывают на том или ином языке программирования. Например, методы в тестирующих классах Microsoft Visual Studio Team Edition представляют собой именно пошаговые описания действий, которые необходимо выполнить тестовому окружению для проведения тестирования. Возможна и более близкая к естественному языку форма подготовки тестовых примеров. Например, при тестировании логической функции с уровнем покрытия MC/DC и описании тестовых примеров на одном из диалектов Visual Basic Script возможно записать сценарий тест-плана в такой форме:
'---------------------------------------------------------------- ' TEST CASES '---------------------------------------------------------------- ' 8 testcases ' 1 2 3 4 5 6 7 8 ' ----------------------------------------------- ' computed - - 0 0 0 - - - ' good1 0 1 0 0 0 0 0 0 ' computed2 - - - - 0 - - - ' good2 1 1 1 0 0 1 1 1 ' delay - - - - - 0 - - ' pack1 1 1 1 1 1 1 0 0 ' pack2 0 0 0 0 0 0 0 1 ' ----------------------------------------------- ' output_message 1 0 0 1 0 0 0 1 '------------------------------------------------------------------- ' Testcase #1: Call Test_Message_Call (-, 0, -, 1, -, 1, 0, 1) '------------------------------------------------------------------- ' Testcase #2: Call Test_Message_Call (-, 1, -, 1, -, 1, 0, 0) '------------------------------------------------------------------- ' Testcase #2: Call Test_Message_Call (0, 0, -, 1, -, 1, 0, 0) '-------------------------------------------------------------------' Testcase #4: Call Test_Message_Call (0, 0, -, 0, -, 1, 0, 1) '-------------------------------------------------------------------' Testcase #5: Call Test_Message_Call (0, 0, 0, 0, -, 1, 0, 0) '-------------------------------------------------------------------' Testcase #6: Call Test_Message_Call (-, 0, -, 1, 0, 1, 0, 0) '-------------------------------------------------------------------' Testcase #7: Call Test_Message_Call (-, 0, -, 1, -, 0, 0, 0) '-------------------------------------------------------------------' Testcase #8: Call Test_Message_Call (-, 0, -, 1, -, 0, 1, 1)
При такой форме представления сценарий каждого тестового примера состоит из последовательности вызовов функций (в данном случае функция всего одна), которые передают данные в среду тестирования.
Как уже говорилось выше, табличное представление тестов удобно при четко формализованных входных и выходных потоках данных системы. Например, в предыдущем фрагменте тест-плана в комментариях приведена таблица, в которой по вертикали указаны имена входных потоков данных системы, по горизонтали приведены номера тестовых примеров, а в ячейках на их пересечении приведены значения. Выходные значения приводятся в том же формате ниже:
' 1 2 3 4 5 6 7 8 ' ----------------------------------------------- ' computed - - 0 0 0 - - - ' good1 0 1 0 0 0 0 0 0 ' computed2 - - - - 0 - - - ' good2 1 1 1 0 0 1 1 1 ' delay - - - - - 0 - - ' pack1 1 1 1 1 1 1 0 0 ' pack2 0 0 0 0 0 0 0 1 ' ----------------------------------------------- ' output_message 1 0 0 1 0 0 0 1
Табличное представление, как правило, используется для упрощения работы по подготовке и сопровождению большого количества однотипных тестов. Среда тестирования, применяющая табличное описание тестовых примеров, в качестве входных данных включает в себя
В случае, когда однотипными являются не только входные и выходные данные, но и их значения, может использоваться альтернативная форма представления табличных данных. Тестовые примеры в ней также нумеруются по горизонтали, а входные потоки данных - по вертикали. Однако, под каждым из потоков данных перечисляются возможные входные значения, а факт того, что это входное значение должно быть передано в данном тестовом примере, отмечается помещением специальной метки (например, символа X ) на пересечении значения и тестового примера в таблице:
+-------------+ INPUTS: | a b c d e f | ----------------------------+-------------+ Power_On_Mode | COLD | X X X WARM | X X X Configuration_Store_Id | 0xFFFD | X X X X X X IR_Access_Mode | 1 | X X X X 0 | X 0xFFFF | X Reset_Mode | 0 | X X X X X X Reset_Source | 0 | X X 1 | X 2 | X X X
При интерпретации каждого такого тестового примера он преобразуется в последовательность команд, которые выполняются средой тестирования. Например, для тестового примера a:
Power_On_Mode = COLD Configuration_Store_Id = 0xFFFD IR_Access_Mode = 1 Reset_Mode = 0 Reset_Source = 1 Run_Test()
Последняя команда здесь запускает тест на выполнение с установленными входными данными.
Форма подготововки тест-планов в виде описания конечных автоматов удобна при тестировании программных модулей или систем, поведение которых также может быть описано в виде конечного автомата. В этом случае процесс тестирования представляет собой обмен сообщениями между двумя конечными автоматами, изменяющими свое состояние в процессе обмена. Критерием полноты такого тестирования будет достижимость всех состояний тестируемой системы всеми возможными способами.
Описание тест-планов в виде конечного автомата обычно состоит из двух частей: определения самого тестирующего конечного автомата и определения сценариев перехода между состояниями - тестовых примеров.
Рассмотрим такой тест-план на следующем примере. Пусть тестируемый модуль представляет собой простой конечный автомат с тремя состояниями - "Начальное", "Прием данных" и "Ошибка". Автомат начинает свою работу в начальном состоянии, из которого может быть переведен в состояние "Прием данных" по получении сообщения "Начало данных". Он может переходить из этого состояния в него же по получению каждого следующего правильного блока данных, в состояние "Ошибка" по получении неверного блока данных или в начальное состояние по получению сообщения "Конец данных". При переходе в состояние "Ошибка" он передает сообщение "Возникла ошибка". Из состояния "Ошибка" он может переходить в начальное состояние по получении сообщения "Ошибка обработана".
Структурная схема такого автомата показана на Рис 11.2.
(рис 11.2) Структурная схема тестируемого конечного автоматаТестирующий конечный автомат должен уметь посылать все воспринимаемые тестируемым автоматом сообщения и воспринимать все посылаемые им сообщения. При этом целью тестирования будет проведение тестируемого автомата по всем состояниям всеми возможными способами. Один из возможных вариантов построения тестирующего автомата заключается в построении автомата с эквивалентными состояниями. Управление таким автоматом в основном будет проводиться при помощи описаний тестовых примеров, а не при помощи сообщений извне.
Так, такой тестирующий автомат будет иметь три состояния - "Начальное", "Передача данных" и "Обработка ошибки". При переходе из начального состояния в состояние "Передача данных" он передает сообщение "Начало данных", в состоянии "Передача данных" он будет передавать блоки данных, описанные в тестовом примере, в т.ч., возможно, ошибочные. При получении сообщения "Возникла ошибка" автомат перейдет в состояние "Обработка ошибки", из которого перейдет в начальное состояние, передав сообщение "Ошибка обработана". В начальное состояние тестирующий автомат может перейти и в случае завершения последовательности блоков данных, описанных в тестовом примере, в этом случае при переходе он пошлет сообщение "Конец данных".
Структурная схема такого автомата показана на Рис 11.3.
(рис 11.3) Структурная схема тестирующего конечного автоматаДалее приведен пример определения этого тестирующего автомата в тест-плане. Оно будет выглядеть следующим образом:
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 - последовательность переходов по состояниям с передаваемыми данными.
При тестировании конечных автоматов при помощи обычных тестирующих классов можно использовать аналогичный подход.
В некоторых случаях для упрощения процедуры тестирования используются специальные инструментальные средства, автоматически генерирующие тестовые примеры. Эти системы различаются по используемым методам генерации тестовых примеров, а получаемые тестовые примеры различаются по областям применимости.
Различают следующие способы генерации тестовых примеров:
Первый способ генерации тестовых примеров приемлем для тестирования системы как "черного ящика", но требует, чтобы тест-требования (или системные/функциональные требования) были подготовлены на специальном формальном языке оформления требований, например,
К сожалению, этот путь достаточно трудоемок и экономия времени от автоматической генерации тестов зачастую сводится на нет необходимостью в выделении дополнительного времени на перевод всех требований в формальную форму. В связи с этим рекомендуется применять данный метод только для тестирования систем, требования на которые могут быть сравнительно легко формализованы с использованием того или иного языка - например, системы поддержки коммуникационных протоколов.
Второй метод генерации тестовых примеров - на основе случайных данных. В этом случае не может идти и речи о систематизированном тестировании и гарантиях качества системы. Такой подход может применяться только при необходимости проверить поведение системы в случае передачи в нее большого количества неверных данных или определить количественные параметры поведения системы под большой нагрузкой.
Третий метод тестирования основан на анализе исходных текстов системы и построения тестов, которые выполняют каждое логическое условие и каждый оператор системы. В результате достигается очень высокий уровень покрытия программного кода. Однако, в этом случае тесты проверяют не то, что система должна делать в соответствии с требованиями, а то, как она делает уже запрограммированное. Перед тестировщиком в этом случае стоит задача анализа программного кода системы на соответствие требованиям, что зачастую представляет собой задачу не менее сложную, чем ручное написание тестов для проверки требований. Обычно рекомендуется вначале написать все тесты по требованиям, а затем, в случае необходимости, воспользоваться генератором тестов по программному коду. При этом целью использования генератора будет не достижение максимально возможного покрытия любой ценой, а анализ причин непокрытия при выполнении тестов требований и, в случае необходимости, коррекции требований.
Отчеты о прохождении тестов - основной (а иногда единственный) источник для заключения о соответствии протестированной системы требованиям. После выполнения всех тестов, описанных в тест-планах, среда тестирования создает отчет о том, насколько успешно система выполнила эти тесты. Такой отчет как минимум содержит информацию о каждом выполненном тестовом примере (его идентификатор) и результат его выполнения - успех или неудача.
По результатам анализа отчетов о прохождении тестов могут быть выявлены либо дефекты в самой системе, либо некорректно составленные или противоречивые требования. В обоих случаях результаты анализа служат основой для создания запросов на изменение требований и/или кода системы. После корректного исправления дефектов при регрессионном тестировании неуспешно выполненные тестовые примеры должны выполниться успешно (Рис 11.4).
(рис 11.4) Генерация отчета о прохождении тестов и изменения по результатам его анализаОтчеты о прохождении тестов могут служить основой для отслеживания состояния проекта: если с течением времени количество обнаруживаемых дефектов (неуспешно выполненных тестовых примеров) падает при условии сохранения качества тестирования - это свидетельствует о повышении качества разрабатываемой системы. С другой стороны, при внесении значительных изменений в систему количество дефектов неизбежно возрастает. Таким образом, идеальный график зависимости количества дефектов от времени похож на синусоиду с уменьшающейся амплитудой на каждом полупериоде.
В предыдущих лекциях уже приводилось несколько примеров отчетов о выполнении тестовых примеров, однако ранее основной уклон делался в сторону общей статистики выполнения тестов.
В стандарте IEEE 829 отчет о прохождении тестов разделен на три различных документа и описан в разделах 9 (
Заголовочная часть отчета о прохождении тестов служит для идентификации отчета и протоколирования того, какая часть разрабатываемой системы подвергалась тестированию, какая ее версия, какая конфигурация тестового стенда использовалась для выполнения тестов.
В заголовочную часть отчета о выполнении тестов обычно включается следующая информация:
Ниже показаны два примера таких заголовочных частей отчета, создаваемых различными инструментальными средствами. Красными цифрами в скобках обозначены соответствующие пункты приведенного выше списка.


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


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

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