БАЗОВЫЕ
ПРОГРАММНЫЕ КОНСТРУКЦИИ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И ИХ ТЕСТИРОВАНИЕ
Н.Л.
Куликова, Ю.П. Кораблин
(Москва, Российский государственный социальный университет, Россия)
При анализе методов обнаружения ошибок
важно как при тестировании в программах на любом языке программирования
анализируются наиболее распространенные программные конструкции: оператор
присваивания, условный оператор и циклические конструкции. Предложенный нами
анализ этих программных конструкций с точки зрения их программного тестирования
позволяет приблизиться к проблеме создания надежных тестовых множеств для обнаружения ошибок при помощи метода компонентного
тестирования.
Рассмотрим оператор присваивания. Пусть
оператор присваивания имеет вид: 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. Булевские выражения (вида В
(Е1,Е2, ... ,Еn)) |
Тесты, вычисляющие Ei 1 £ i £ n, должны
обеспечивать все возможные комбинации Т и F. |
Рис. 2. Надежные тесты для простых ошибок
В заключении следует
отметить, что для всех методов, опирающихся не столько на внутреннюю структуру
программы, сколько на специфику ошибок, которые эти методы обнаруживают,
приведенные в нашем исследовании надежные тесты для простых ошибок, а также
анализ множества функций, которые реализуются оператором цикла, являются базой
для развития компонентного тестирования и исследования проблем программной
надежности, связанных с тестированием базовых элементов языков
программирования.