- •Верификация программ
- •Метод верификации на основе программных функций
- •Верификация структурированных программ
- •Правильность элементарных программ
- •Лемма о сведении итерационных программ к рекурсивным
- •Методика верификации циклических программ типа while-do, do-until, do-while-do
- •Верификация программы for-do
- •Метод индуктивных утверждений
- •Функциональные методы тестирования метод функциональных диаграмм
- •Тестирование программ
- •1 Шаг. Тщательный анализ спецификаций. Определение причин и следствий.
- •2Шаг. Изобразить функциональную диаграмму («и-или» граф)
- •Метод эквивалентного разбиения
- •Метод анализа граничных условий (значений)
- •Структурные методы поектирования тестов
- •Метод покрытия операторов
- •Метод покрытия переходов
- •Метод покрытия условий
- •Метод комбинаторного покрытия условий
- •Общая стратегия проектирования тестов
- •Тестирование модульных программ
- •Монолитное тестирование методом «большого удара»
- •Пошаговое тестирование
- •Тестирование потоков данных
- •Особенности тестирования циклов
- •1. Простые циклы
- •2. Вложенные циклы
- •3. Объединенные циклы
- •4. Неструктурированные циклы
- •Тестирование правильности
- •Тестирование объектно-ориентированных программ
- •Расширение области применения тестирования про ооп
- •Изменение методики при объектно-ориентированном тестировании
- •Особенности тестирования объектно-ориентированных «модулей»
- •Тестирование объектно-ориентированной интеграции
- •Объектно-ориентированное тестирование правильности
- •Проектирование объектно-ориентированных тестов
- •Построение тестов, основанное на ошибках
- •Построение тестов, основанных на сценариях
- •Способы тестирования содержания классов
Правильность элементарных программ
Если верифицируемая программа P является ациклической, то доказательство может быть проведено непосредственным построением [P] по E-схеме и сравнением [P] с заданной функцией f.
Если P является циклической, то при доказательстве правильности вначале необходимо установить неизбежность ее окончания.
Условимся,
что если P заканчивается для
,
то некоторый предикат (обозначим его
fin(f,P)) принимает значение «истина».
Верификацию циклических программ типа
while-do
do-until
do-while-do
можно свести к доказательству их окончания и к доказательству правильности ациклических рекурсивных программ.
Лемма о сведении итерационных программ к рекурсивным
Пусть даны функции f, g, h и предикат p. Тогда справедливы 3 случая:
while-do
(f=[
while
p do
g od])
(fin(f,
while
p do
g od
)^f=[ if
p then
g; f fi
])
do-until
(f=[ do g until p od ]) (fin(f, do g until p od)^f=[g; if ¬p then f fi])
do-while-do
(f=[ do1 g while p do2 h od ]) (fin(f, do1 g while p do2 h od)^f=[g; if p then h; f fi])
Методика верификации циклических программ типа while-do, do-until, do-while-do
Формулируется гипотеза о программной функции (в частном случае гипотеза может быть задана).
На основе субъективного анализа программы устанавливается истинность условия ограничения: fin(f,P)=true.
С использованием леммы о рекурсивном представлении программа приводится к рекурсивной форме.
С помощью трассировочных таблиц строится программная функция рекурсивной программы.
Проводится сравнение полученной функции с гипотезой и делается вывод о правильности программы.
Трассировочные таблицы
Они предназначены для формальной записи вывода программных функций.
Номер операторов |
Операторы программы |
Элемент данных |
|
|
|
Трассировочные таблицы позволяют путем систематического исключения всех промежуточных значений индексов, начиная с конечных значений, вывести функцию программы.
Пример 1.
P=(
if
x
0
then
x:=x-y
else y:=y-x fi;
if y 0 then y:=x+y
else x:=y-x fi)
[P]=?
В программе есть 4 пути от входа к выходу. Поэтому строим 4 трассировочные таблицы.
№ |
Операторы Предикаты |
Значение предикатов |
Данные |
|
X |
Y |
|||
1 |
x 0 |
(x0 0)=true |
x1=x0 |
y1=y0 |
2 |
x:=x-y |
|
x2=x1-y1 |
y2=y1 |
3 |
|
(y2 0)=true |
x3=x2 |
y3=y2 |
4 |
y:=x+y |
|
x4=x3 |
y4=x3+y3 |
Их таблицы выводим программную функцию для выбранного пути
- предикат пути
(x0 0)^ (y2 0)= (x0 0)^ (y1 0)= (x0 0)^ (y0 0)=True
- данные
x4=x3=x2=x1-y1=x0-y0
y4=x3+y3= x2+y2= x1-y1+y1=x0
- функция
(x 0)^ (y 0)→x,y:=x-y,x
№ |
Операторы Предикаты |
Значение предикатов |
Данные |
|
X |
Y |
|||
1 |
x 0 |
(x0 0)=false |
x1=x0 |
y1=y0 |
2 |
y:=y-x |
|
x2=x1 |
y2=y1-x1 |
3 |
0 |
(y2 0)=true |
x3=x2 |
y3=y2 |
4 |
y:=x+y |
|
x4=x3 |
y4=x3+y3 |
Вывод программной функции:
- предикат пути
(x0
0)^
(y2
0)=
(x0
0)^
((y1-x1)
0)=
(x0
0)^
(y0
x0)=True
- данные
x4=x3=x2=x1=x0
y4=x3+y3= x2+y2= x1+y1-x1=y0
- функция
(x 0)^ (y x)→x,y:=x,y
Аналогично выводится программные функции для двух других путей.
Объединяя функции путей, получаем функцию программы:
[P]=(((x 0)^(y 0)→x,y:=x-y,x)|((x 0)^(y x)→x,y:=x,y)|((x 0)^(y 0)→x,y:=2y-x,y)| ((x 0)^ (y x)→x,y:=y-2x,y-x))
Пример 2
Дана
функция f=(k
n→x:=x∙k∙(k+1)∙…∙n=(
k
n→x:=x∙
)),
где k
и n
– целые.
Для выполнения f составлена программа P
P=( while k n do x:=x∙k;
k:=k+1 od)
Доказываем правильность P
Гипотеза о программной функции в данном случае задана
Если начальное значение k: k>n, то P завершается сразу; k n, то в ходе итераций k:=k+1 и станет k>n, т.е. P завершится. Следовательно, fin(f,P) = истина.
Используем лемму для записи P в рекурсивной форме:
P'=(if k n then x:=x∙k;
k:=k+1;
(k n→x:=x∙ ) fi)
Для рекурсивной формы программы P' выводим программную функцию. Строим трассировочную таблицу.
№ |
Операторы Предикаты |
Значение предикатов |
Данные |
|
X |
K |
|||
1 |
k n |
(k0 n)=true |
x1=x0 |
k1=k0 |
2 |
x:=x∙k |
|
x2=x1∙k1 |
k2=k1 |
3 |
k:=k+1 |
|
x3=x2 |
k3=k2+1 |
4 |
k n |
(k3 n)=true |
x4=x3 |
k4=k3 |
5 |
x:=x∙ |
|
x5:=x4∙ |
k5=k4 |
Вывод функции для выбранного пути:
-предикат
(k0 n)^(k3 n)= (k0 n)^(k2+1 n)=…= (k0 n)^(k0+1 n)= (k0 n-1)=True
-данные
x5=x4∙
=
…=x2∙
=
x1∙k1∙
=
x0∙k0∙
=x0∙
-функция
(k n-1)→ x:=x∙
№ |
Операторы Предикаты |
Значение предикатов |
Данные |
|
X |
K |
|||
1 |
k n |
(k0 n)=true |
x1=x0 |
k1=k0 |
2 |
x:=x∙k |
|
x2=x1∙k1 |
k2=k1 |
3 |
k:=k+1 |
|
x3=x2 |
k3=k2+1 |
4 |
k n |
(k3 n)=false |
x4=x3 |
k4=k3 |
Вывод функции для выбранного пути:
-предикат
(k0 n)^(k3 n)= (k0 n)^(k2+1 n)=…= (k0 n)^(k0+1 n)= (k0=n)=True
-данные
x4=x3=x2=x1∙k1=x0∙k0=x0∙n
-функция
((k=n)→ x:=x∙n)= ((k=n)→ x:=x∙ )
№ |
Операторы Предикаты |
Значение предикатов |
Данные |
|
X |
K |
|||
1 |
k n |
(k0 n)=false |
x1=x0 |
k1=k0 |
Вывод функции для выбранного пути:
-предикат
(k0 n)=True
-данные
x1=x0
-функция
(k>n)→ x:=x
Объединяем функции путей, получаем функцию программы
[P’]=((k
n-1)→x:=x∙
)
((k=n)→x:=x∙
)
((k>n)→x:=x)=(k
n)→
x:=x∙
=f
Отсюда следует, что составленная программа обладает полной правильностью.

0