Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек13.doc
Скачиваний:
6
Добавлен:
01.04.2025
Размер:
300 Кб
Скачать
☆

13.6. Тестирование обработки потоков данных программными компонентами

Функционирова­ние любой программы можно рассматривать как обработку потока данных, передаваемых от входа в программу к ее выходу (см. п. 13.1). Входные данные последовательно используются для определения ряда проме­жуточных результатов вплоть до получения необходимого набора выходных данных. Задача тестирования и анализа потока данных состоит в установлении корректности их обработки и в выявлении ошибок в тестируемой программе. Эта задача может решаться статически  без исполнения программы (анализом по ее тексту) и динамически  путем реального исполне­ния программы на ЭВМ в машинных кодах при различных исходных данных.

Наборы действий по преобразованию исходных данных в выходные могут быть формализованы диаграммами потоков данных (DFD – Data Flow Diagrams). Для этого применяется система графических элементов, содержащих квадратики с описаниями сущностей и номерами, а также соединяющие их стрелки процессов:

  • внешние сущности – объекты, являющиеся источниками или потребителями информации, идентифицируемые их содержанием и номерами;

  • процессы, перемещающие объекты от одного действия к другому, преобразующие исходные данные в результирующие;

  • накопители объектов или данных, где временно они размещаются на хранение;

  • потоки данных – информация, передаваемая от источника к потребителю.

Для построения DFD-диаграмм, формализованы синтаксис и семантика графических элементов: отражающих движение объектов – процедуры программ; описаний внешних сущностей – источников и потребителей данных; их хранения. Рекомендуется вначале определять набор действий, описывающих, что должны выполнять процедуры программы. Затем строить модель окружения – внешние сущности, порождающие процессы и специфическое поведение при обработке данных. Наборы простейших DFD-диаграмм – операторов программы, объединяются в иерархические структуры, отражающие потоки данных в программных модулях или функциональных компонентах из ряда модулей.

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

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

  • полностью изменяющей область определения и значения результатов обработки;

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

Первому виду обработки соответствуют исходные данные в критических точках и на границах областей изменения переменных. При таких критических значениях может изменяться маршрут исполнения программы, вследствие чего возможно наибольшее изменение резуль­татов. Поэтому обычно тестирование обработки данных, прежде всего, направлено на проверку исполнения программ при значениях переменных, влияющих на выбор маршрута и логику функционирования программ (стратегия выделения областей переменных). Граничные условия  это ситуации, возникающие в непосредственной близости к границам об­ластей коренного изменения обрабатываемых переменных. Число таких крити­ческих значений каждой переменной может быть на несколько поряд­ков меньше, чем число значений по всей внутренней части области изменений этой величины.

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

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

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

  • тестирование при значениях данных, определяющих маршруты исполнения программы (стратегия областей);

  • тестирование корректности записи и считывания переменных при вычислениях и полноты состава выходных данных на всех маршрутах исполнения программы;

  • тестирование точности результатов вычислений и коррект­ности обработки каждой переменной;

  • тестирование на полное соответствие спецификации требований состава, значений и точности выходных данных.

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

Тестирование при значениях данных, определяющих маршруты исполнения программы (стратегия областей). Маршруты последова­тельности обработки данных могут зависеть от любых типов анализируемых вели­чин. Одной из задач тестирования является проверка сопоставимости сравниваемых типов величин и идентичности условий их кодирования (разрядности, масштабов). Критические значения предикаты, влияющие на выбор маршрутов, во многих случаях не являются фиксированными, а формируются при обработке данных и/или сравнении нескольких переменных. При этом предикаты могут образовываться во всей области изменения каждой из переменных, нап­ример, когда они оказываются равными или отличаются на некоторую постоянную величину.

Предикаты, определяющие выбор маршрутов исполнения програм­мы, могут формироваться в результате вычислений на линейных участках программы. Эти участки в среднем невелики и содержат около 5  10 строк текста программы. Каждая ограниченная область исходных данных соответствует определенному маршруту в программе. Граница области определяется интерпретациями предикатов по маршруту и состоит из набора участков границы, каждый из которых определяется единственным, простым предикатом, выбирающим дугу маршрута в графе программы. Каждый участок границы области может быть открытым или закрытым в зависимости от оператора условий в предикате. Закрытый участок границы принадлежит ограничиваемой области и формируется преди­катами с операторами ,  или = . Открытый участок границы не входит в состав области и формируется операторами < , > и . Об­щее число предикатов в маршруте  это верхний предел числа гра­ничных участков области входных переменных данного маршрута, так как некоторые предикаты маршрута могут в действительности не создавать граничных участков. Такие случаи возникают, когда пре­дикат требуется для нескольких путей, и в некоторых из них повторно анализируется на маршруте.

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

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

Тестирование корректности определения и использования данных на маршрутах исполнения программы. Если маршруты исполнения программы соответствуют допустимым областям изменения входных данных, то целесообразно проверять корректность основных операций обработки данных на выделенных маршрутах. Каждая величина на маршруте исполнения программы считывается из памяти, и после использования для вычислений записывается в память ЭВМ для хранения и последующей обработки. Чере­дование операций чтения и записи переменных может быть нарушено в результате ошибок в программе. Для выявления таких ошибок про­водится тестирование корректности записи и считывания реальных данных или статический анализ этих операций по исходному тексту программы.

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

Множество тестовых значений для проверки вычислений при простых числовых переменных целесообразно строить упорядоченно с учетом следующих правил:

  • входные тестовые данные в области гладкого изменения, за­висящих от них результатов, должны принимать, по крайней мере, значения, близкие к наибольшим и наименьшим, а также одно-два промежуточных значения;

  • тестирование должно проводиться при всех особых значениях входных переменных  в точках резкого возрастания или разрыва производных, при нулевых, единичных и предельно малых численных значениях;

  • входные тестовые значения должны обеспечивать проверку программы при выходных результатах, имеющих особые точки резкого изменения или разрыва производных;

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

Таким образом, для каждой простой числовой переменной, кро­ме трех точек вблизи и на границе области определения, обычно необходимо тестирование программы в 3  4 промежуточных и в 2  5 особых точках значений входных данных. При 10 входных переменных и сложных вычислениях в программном модуле для тестирования вы­числений может потребоваться до 50 тестовых значений. Группируя и упорядочивая тестовые значения разных переменных, их общее ко­личество можно сократить до 5  10 тестовых наборов.