БАЗОВЫЕ ПРОГРАММНЫЕ КОНСТРУКЦИИ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И ИХ ТЕСТИРОВАНИЕ

Н.Л. Куликова, Ю.П. Кораблин

(Москва, Российский государственный социальный университет, Россия)

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

Рассмотрим оператор присваивания. Пусть оператор присваивания имеет вид: v:= ехр, где v – переменная или элемент массива программы р, а ехр – арифметическое выражение. Все переменные и элементы массивов, входящие в правую часть оператора присваивания, или индексные выражения в левой части оператора присваивания ассоциируется с функциями доступа к данным. Функция записи данных ассоциируется с переменной в левой части оператора. Индексные выражения и выражения в правой части оператора ассоциируются с функциями вычисления арифметических выражений.

Рассмотрим условный оператор. Предположим, что условный оператор имеет вид: if B then s1 else s2, где B - булевское выражение, а s1, s2 – операторы. Выражение В можно рассматривать как реализацию булевской функции. С каждой переменной, входящей в В, ассоциируется функция доступа к данным, с арифметическими выражениями, входящими в В,   – арифметические функции, с отношениями – функции вычисления отношений, и с целым выражением В – функция вычисления булевского выражения. Части s1 и s2 либо содержат, в свою очередь, условные операторы (в случае вложенных условных операторов), либо функции, ассоциированные с другими операторами.

Рассмотрим два вида циклических конструкций:

for I = E1 by C to E2 do:иWhile E do:”.

Конструкция типа for может рассматриваться как реализация четырёх множеств функций. Первое множество содержит функции, реализуемые входным отношением в цикл Е2 ³ Е1 (для С ³ 0) или Е1 ³ Е2 (для С < 0). Входное отношение используется для проверки того, нужно ли входить в цикл. Оно реализует функцию арифметического отношения, функции доступа к данным для всех переменных, входящих в выражение, и функции арифметических выражений, зависящие от вида Е1 и Е2. Второе множество функций составляют функции, реализуемые выходным выражением цикла I > Е2. Это выражение используется в конце каждой итерации цикла для проверки того, нужно ли выходить из цикла. Третье множество функций реализуется неявным оператором I ¬ Е1 используемым для инициализации индекса цикла. Четвертое множество функций реализуется неявным оператором I ¬ I  + С, используемым в конце каждой итерации цикла.

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

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

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

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

На рисунке 1 приведена таблица, в которой указаны рассмотренные выше типы операторов и соответствующие им функции.

 

ОПЕРАТОРЫ

ФУНКЦИИ

1. Присваивание

Доступ к данным, запись данных, арифметические выражения

2. Условный оператор

Доступ к данным, арифметическое выражение, отношение, булевское выражение.

3. Оператор цикла

Функции входа в цикл: доступ к данным, арифметическое выражение, отношение, булевское выражение.

Функции выхода из цикла: доступ к данным, арифметическое выражение, отношение, булевское выражение.

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

Индексация: доступ к данным, запись данных, арифметическое выражение.

Рис. 1. Типы операторов и соответствующие им функции

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

 


ФУНКЦИИ

НАДЕЖНЫЕ ТЕСТОВЫЕ ДАННЫЕ

1. Доступ к данным

Уникальное значение для переменной

2. Запись данных

Новое значение для переменной

З.Арифметическое выражение

Вычисление ненулевых значений

4. Отношения (вида Е1 r Е2)

Тесты для оценки Е1 и Е2 такие, что

Е1 < Е2, Е1 = Е2 и Е1 > Е2;

Тесты для оценки Е1 и Е2 такие, что, для:

r =<, ³:  (1)

Е2- Е1 - максимальное значение <0;

Е2- Е1 - минимальное значение ³0;

r=>, £:   (2)

Е2- Е1 - минимальное значение >0;

Е2- Е1 - максимальное значение £0;

r = =, ¹:   (3)

Е2- Е1 = 0

5. Булевские выражения

(вида В12, ... ,Еn))

Тесты, вычисляющие Ei 1 £ i £ n, должны обеспечивать все возможные комбинации Т и F.

Рис. 2. Надежные тесты для простых ошибок

 

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