Из (26) следует справедливость равенств (17).
Теорема доказана.
Замечание. При доказательстве теоремы 2 использованы идеи доказательства так называемой теоремы о нормальной корреляции случайного вектора [1]. Теорема 2 фактически представляет собой обобщение этой теоремы на случай гауссовских процессов, описываемых уравнениями (1), (2). Однако при данном обобщении мы ограничиваемся случаем, когда ij(t) является невырожденным процессом.
Пример. Пусть стохастические дифференциальные уравнения (1), (2) с заданными начальными условиями описывают одномерные процессы g(t) и rjit), коэффициенты этих уравнений являются постоянными величинами:
d^{f) = a^) + bdv\{f), t е [О,Г], ф) = £0,
drj{t)= A$(t) + Bdw2{t), Tj{o)=J70,
a = const, A = const, b = const, В = const.
Задачи (14) имеют в данном случае вид:
dm^(t)
dt
dt
Отсюда
ат^ (/), mg (О) = М%0 = т\, = Ат^ (?), тп (О) = Mi]0 = mJ .
mg(t)=m%eat,
+ mA
Задача (16) для рассматриваемого случая представляется следующим образом:
Жр(‘)_ dt
'a O' [Ri
A* , J oj A* Rt] ^
Ь 0 0 В
A(°) ^(°)1
R^(0) ^(0) j W *2)
Re{0) =
Ставропольский государственный университет
Отсюда,учитывая, что R^rJ{i) = RJJ^{t),t е [0,г], после элементарных преобразований получаем систему:
к^) = 2аЯ^)+Ь2, Я4(0)=д£,
• R^)=^)+AR^\
к^)=2АП^)+В2, Rn{0) = Rl
из которой находим R^[t) =
Ґ l2 ^
Rl+ —
0 2 а
J
ex
p(2 at)-
2 a
Rp +
a
(exp (a/)-1)+
+ -
Ab2
la2
(exp(- a/)-lH exp(a/),
*„(')=*?+-
0 2 a
(exp(a/)-1) +
B2-^
t.
Оптимальный линейный фильтр по текущим наблюдениям (17) построен.
Литература
1. Липцер Р Ш., Ширяев А.Н. Статистика случайных процессов. М., 1974.
2. Флеминг У., Ришел Р. Оптимальное управление детерминированными и стохастическими системами. М., 1978.
3. Пугачев B.C., Синицын И.Н. Стохастические дифференциальные системы. М., 1985.
4. Гихман И.И., Скороход А В. Введение в теорию случайных процессов. М., 1977.
5. Науменко Б.С. II Изв. вузов. Сев.-Кавк. регион. Техн. науки. 2002. Спецвыпуск. С. 45-48.
6. Волков И.К., Зуев С.М., Цветкова Г.М. Случайные процессы / Под ред. B.C. Зарубина, А.П. Крищенко. М., 2000.
7. Севастьянов Б А. Курс теории вероятностей и математической статистики. М., 1982.
______________________________________14 февраля 2003 г.
УДК 681.3.07
МИНИМАЛЬНОЕ МНОЖЕСТВО КОНТРОЛЬНЫХ ДУГ ПРИ ТЕСТИРОВАНИИ ПРОГРАММНЫХ МОДУЛЕЙ
О 2003 г. Б.Я. Штейнберг, М.В. Напрасникова
Software automatic testing system has been created. System lets programmer to keep up with tests way over testing program control graph branches.
New algorithm proposed in this system finds minimal set of the control graph branches sufficed to observe.
Введение
Написана программная система для автоматического тестирования программ, отслеживающая прохождение тестов по всем дугам управляющего графа программы, при этом контроль ведется не за всеми дугами. Разработан алгоритм нахождения минимального множества таких дуг, за которыми достаточно вести наблюдение. Кроме того, в системе заложена возможность тестирования с помощью эталонной программы, что позволяет расширить область ее использования.
В качестве основного требования тестирования в системе используется требование покрытия всех маршрутов управляющего графа программы [1, с. 55]. Считается, что программа проверена, если с помощью тестов удается осуществить ее выполнение по всем возможным маршрутам ее потока (графа) передач управления. Для реализации этого требования используется специальный алгоритм нахождения минимального множества U* дуг управляющего графа программы. Это минимальное множество должно удовлетворять следующему свойству: если множество
путей Р* от источника к стоку покрывает множество дуг U*, то это множество путей покрывает все передачи управления программы.
Ошибки, появление которых связано с обрабатываемыми данными, могут остаться необнаруженными даже при условии полного тестирования маршрутов. Таким образом, сочетание входного тестирования (обнаружение ошибок, связанных с данными) с помощью эталонной программы с тестированием передач управления является более мощной стратегией тестирования.
1. Контроль за прохождением тестов
Требование прохождения тестов по всем передачам управления в программе - одно из наиболее утвердившихся к тестированию программных модулей. Его недостатком является, с одной стороны, то, что оно не гарантирует полноту тестирования. С другой стороны, рассматриваемое требование покрытия всех дуг тестами не всегда может быть выполнено. Например, в следующем фрагменте программы одна передача управления, очевидно, никогда не будет покрыта тестами:
x:=l+sin(y);
if хО then А:=х else В:=х;
Можно привести примеры программ, графы которых содержат дуги, которые в принципе покрыть возможно, но с очень малой вероятностью. Однако из существования таких примеров не следует делать выводы, что требование покрытия всех дуг графа программы тестами неразумно. К этому требованию можно относиться, как к идеалу: к покрытию всех дуг следует стремиться в рамках отведенного на тестирование времени.
Контроль за прохождением тестов (наборов входных данных) по дугам графа программы можно автоматизировать. Для этого необходимо на передачах
управления тестируемой программы поставить специальные дополнительные операторы (контрольные точки), которые будем называть регистраторами. Например, следующему фрагменту программы if А < 0 then В “ -A else В := А; соответствует часть графа (рис. 1) и расширенный регистраторами текст
if А < 0 then begin В := -А;
R[1]:=R[1]+1; end else begin В := A; R[2] := R[2]+l; end; где R[l] регистрирует прохождение текста по дуге 1, а R[2] — по дуге 2. При этом объем программы увеличивается примерно вдвое, и добавляются новые переменные. Такое вмешательство в текст тестируемой программы может привести к уменьшению быстродействия. Но для контроля за покрытием всех передач управления тестами не обязательно наблюдать за всеми дугами графа. Например, на графе рис. 2, если S-Т путями покрыты дуги (2,1), (1,4) и (2,3), то и все остальные дуги тоже покрыты. Поэтому актуальной становится задача минимизации контрольных дуг графа.
•
2. Минимальное множество контрольных дуг графа программы
Формализуем задачу нахождения минимального множества контрольных дуг графа программы. Будем говорить, что множество S-Т путей Р покрывает
множество дуг U* (подмножество U), если для любой дуги и из U* найдется путь р из Р, содержащий эту дугу.
Граф G(X,U) называется корректным, если любая
его вершина принадлежит некоторому S-Т пути.
Задача. Найти такое наименьшее по количеству элементов множество дуг U* (подмножество U) из корректного управляющего графа программы G(X,U), что любое множество S-Т путей Р, покрывающее все дуги из U*, покрывает вообще все дуги U графа G(X,U).
Граф G корректен тогда и только тогда, когда его конденсация G* имеет один источник и один сток.
if А<0
Дня проверки корректности графа программы предлагается алгоритм, использующий матрицу достижимостей (МД) [2, с. 121], которую невозможно построить быстрее,
чем за 0(| X |2) шагов, поскольку она имеет | X |2 элементов. МД строится следующим образом.
Пусть Ms - матрица смежностей [2, с. 123], т.е.
л
матрица путей длины 1. Тогда Ms — матрица путей
длины 2 и т.д. Нас интересует матрица - Msn, где п - количество вершин. Так как нас интересует только существование путей, а не их количество, то имеет смысл рассматривать матрицы, элементы которых TRUE или FALSE и совершать над ними логическое умножение. Все это значительно увеличивает быстродействие.
Конденсацией графа G называется граф G*, вершинами которого являются все компоненты сильной связности графа [2, с. 81], а дуги соединяют такие и
только такие пары (а ,Ь*), для которых существуют такие вершина а из компоненты а и вершина Ъ' из 6*, что (а,Ь) содержатся в U. Предлагаемый алгоритм опирается на следующий очевидный факт. Анализируя МД Md = Ms, находим компоненты сильной связности и потом делаем вывод о корректности графа.
Будем говорить, что дуги и и v связаны отношением и > V , если любой S — T путь, проходящий через v, проходит и через и . Легко заметить, что отношение > является частичным порядком на множестве U. Если u>v и v>u, то дуги и и v будем называть эквивалентными.
Теорема 1. Решением задачи является множество всех минимальных в смысле установленного частичного порядка > дуг, причем если имеются эквивалентные минимальные дуги, то среди них надо выбрать по одному представителю.
Обозначим XI(и) (Х2(и)) - множество всех вершин, не достижимых из S (из которых не достижима вершина Т), если из графа G удалить дугу и .
Теорема 2. Пусть и - произвольная дуга графа G. Множество всех дуг, начало которых принадлежит XI(и), или конец принадлежит Х2(и) в точности составляет множество всех дуг V, для которых и > V .
Доказательство вытекает из определения отношения >.
Для решения задачи предлагается следующий алгоритм:
1. Каждой дуге и из U присваиваем нулевую метку MARK[m]:=0, переменной М присваиваем нулевое значение, все дуги объявляем не просмотренными.
2. Среди не просмотренных дуг находим дугу с максимальной меткой. Если таких дуг несколько, то из них выбираем любую.
3. М:=М+1. Номер этой дуги присваиваем переменной , Если не просмотренных дуг не оказалось, то конец работы.
4. Находим множества А'Цы), Х2{и) . Всем дугам и , для которых и< и>, присваиваем метку М. Более подробно: читаем список всех дуг и и для каждой дуги и проверяем, принадлежит ли начало и множеству Х\(и) и принадлежит ли конец и множеству Х2(и) - если хотя бы одно из этих условий выполнено, то МАЫК[и]:=М.
5. Если метку М не получила ни одна дуга, то дугу заносим в решение (выходной массив).
6. Если метку М получили только просмотренные дуги, которые не занесены в решение, то дугу заносим в решение.
Множества Х1(и), Х2(и) можно найти следую-'
щим методом. Построить МД М(1 = Му”-1 для графа с выкинутой дугой и и, анализируя первую строку и последний столбец, получить множества Х\{и), Х2(и) . Дугу IV объявляем просмотренной и-переходим к пункту 2. Алгоритм нельзя исполнить быстрее, чем за 0(|ЛГ|2) операций.
3. Программа-эталон и автоматическая генерация входных данных
Способ тестирования, который предлагается в этой работе, предоставляет возможность максимальной автоматизации тестирования за счет использования программы-эталона (тестирование функциональной эквивалентности [3, с. 197]). Входные значения тестируемая программа получает из файла, созданного генератором тестов, а эталонные результаты - из файла с результатами работы программы-эталона.
Например, для программы, реализующей алгоритм Штрассена [4, с. 259] перемножения двух матриц, в качестве программы-эталона можно использовать программу, которая перемножает матрицы обычным способом.
Для программы, реализующей метод Дейкстры [4, с. 236; 2, с. 364] нахождения кратчайшего пути из данной вершины ко всем остальным, в качестве эталонной можно использовать программу, реализующую метод Флойда [2, с. 367] нахождения всех кратчайших путей.
Этот подход удобно использовать для тестирования таких систем преобразования программ, как оптимизирующие, распараллеливающие компиляторы и препроцессоры. В эхом случае эталонной будет программа, которая поступает на вход компилятору, результаты ее работы будут сравниваться с результатами работы той же программы, но после преобразования ее компилятором, а в качестве тестируемой программы будет выступать сам компилятор.
Для автоматизации тестирования необходимо получить списки переменных и код исходной програм-
мы, расширенный регистраторами. Новая программа эквивалентна исходной. Операторы чтения с экрана заменяются операторами чтения из файла, операторы вывода на экран заменяются операторами вывода в файл, также вставляются описания файловых переменных и функции работы с файлами.
В примере на рис. 3 слева находится код исходной программы, справа - измененный. Более тонким шрифтом напечатаны добавленные строки, курсивом -измененные строки. На данном примере видно, что изменения не затрагивают вычислительную часть программы, а влияют только на ввод и вывод значений.
1 а=0;
1 а=0;
Absign(out, 'out.txt'); Rewrite(out);
2 for i=l to n do
3 begin
4 rcad(b);
5 a:=a+b;
6 end;
7 writc(a);
Assign(in, 'in.txt'); Rewrite(in);
2 for i=l to n do
3 begin
4 readfin, b);
5 a:=a+b;
6 end;
7 write (out, a); Close(in);
Close(out);
Для автоматического формирования тестов, а также для анализа результатов работы программ необходима информация о входных и выходных переменных. Например, для дальнейшего тестирования важно, находятся ли входные переменные в цикле. Эта информация используется в процессе генерации тестов. От того, находится оператор READ в теле цикла или нет, зависит количество его реализаций и соответственно количество значений для входных переменных в этом операторе.
4. Контроль за допустимостью входных данных
Еще одним важным вопросом, связанным с автоматическим формированием тестов, является вопрос об области значений выражений, в которых .участвуют переменные, получающие значения из файла, составленного автоматическим генератором тестов.
Чтобы контролировать правильность значений для входных переменных с ограничениями, поступаем следующим образом. В новом файле каждую строку,
содержащую выражение с участием данной переменной, требующее ограничений, заменим строкой специального вида: if Cond(Arg) then S(Arg), где S -строка исходной программы; Arg - выражение, требующее наложения ограничений; Cond(Arg) - условие выполнения строки S(Arg). •
Проиллюстрируем это на следующем примере:
Х:= SQRT(X);
Z:=Y/X,
В этом примере значение переменной X не может равняться нулю, так как во второй строке она присутствует в знаменателе. Также значение переменной X не может быть меньше нуля, так как в первой строке X находится в подкоренном выражении. Исходный код после изменений будет иметь вид:
IF X >= 0 THEN BEGIN Х:= SQRT( X);
IF X о 0 THEN Z:=Y/X; END.
Из примера видно, что в исходном коде появились условные операторы, обеспечивающие защиту от сбоев при генерации недопустимых тестовых значений.
Заключение
Описываемая в данной статье программная система может также использоваться в учебном процессе, на практических занятиях по программированию. Для этого преподаватель должен иметь свои отлаженные программы, реализующие все задания, которые он предлагает студентам.
Примера альтернативного способа автоматизации учебного процесса можно найти в работе [5], где приводится описание программы, которая позволяет генерировать варианты заданий из библиотеки для учащихся, а также предоставляет программе учащегося исходные данные и получает из нее результаты. Литература
1. Майерс Г. Искусство тестирования программ. М., 1982.
2. Свами М., Тхуласираман К. Графы, сети и алгоритмы. М., 1984.
3. Канер С. и др. Тестирование программного обеспечения. Киев, 2000.
4. Ахо А., Хопкрофт Дж., Ульман Дж. Построение и анализ вычислительных алгоритмов. М., 1979.
5. Абрамян МЭ. Практикум по программированию. Ч. 2: Конструктор учебных заданий. Ростов н/Д, 1998.
Ростовский государственный университет
14 января 2003 г.