logo
Разработка вспомогательной системной программы в системе программирования Delphi с использованием средств WinApi

3.6 Методы испытаний

3.6.1 Тестирование методом белого ящика:

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

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

1инициализация

2if Edit1.Text <> then

Begin

WriteDataInMMF(Nicname+ Написал:+#13#10+string(Edit1.Text));

(тело функции WriteDataInMMF(вхдными данными является строка S)

имеет следующий вид):

begin

3 WaitForSingleObject(HMutex, INFINITE);

PBaseAdress:=MapViewOfFile(HFileSender,FILE_MAP_WRITE,0,0,Length(s)+4);

4 if(PBaseAdress = nil) then

begin

5 CloseHandle(HFileSender);

st:=не удалось передать данные;

Application.MessageBox(st,Сообщение...,MB_OK);

exit;

end;

begin

6 integer(PBaseAdress^):=length(s);

CopyMemory(Pointer(Integer(PBaseAdress)+4),PChar(s),length(s));

UnmapViewOfFile(PBaseAdress);

SetEvent(HEvent);

ReleaseMutex(HMutex);

7 end;

8 end;

9 Edit1.Text:=;

10 end

else

11 exit;

12 end;

Рисунок 4.1 - Потоковый граф обработчика события «Событие1» которое происходит при нажатии на кнопку «ОТПРАВИТЬ» на основной форме программы.

Цикломатическая сложность потокового графа:

1) V(G) = 3 региона;

2) V(G) = 13 дуг - 12 узлов + 2 = 3;

3) V(G) = 2 предикатных узла +1 = 3.

Базовое множество независимых линейных путей:

Путь 1:1-2-11-12 .

Путь 2: 1-2-3-4-5-12.

Путь 3: 1-2-3-4-5-6-7-8-9-10-12.

Таблица тестовых вариантов 4.1

пути

Исходные данные

Ожидаемые результаты

Реальные результаты

1

Строка содержащая, которая должна содержать текст сообщения пуста

Не происходит отправки пустого сообщения

Состояние программы после перехода на главную форму не

2

Не удалось отобразить файл на адресное пространство процесса при обращении к дескриптору файла , проецируемого в память.

Сообщение:

«Не удалось отобразить файл на адресное пространство процесса»..

Сообщение:

«Не удалось отобразить файл на адресное пространство процесса».

3

Текст сообщения: «Привет!»

Появление текста «Привет!» в поле истории переписки.

Удачный исход - появление текста «Привет!» в поле истории переписки

2) Тестирование процедуры выполняющей создание дескрипторов логического диска с

которым ведётся работа и дескриптора жёсткого диска которому принадлежит этот логический диск(3 этап выполнения программы ).

1 инициализация

2 if hDrive <> 0 then

3CloseHandle(hDrive);

4 if hMBRDrive <> 0 then

5CloseHandle(hMBRDrive);

6 discNameBPB:=.+DriveComboBox1.Drive+:;

discNameMBR:=.PHYSICALDRIVE+intToStr(0);

hMBRDrive:= CreateFile(PChar(discNameMBR),GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);

hDrive:= CreateFile(PChar(discNameBPB),GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);

7 if (hDrive <> INVALID_HANDLE_VALUE) and (hMBRDrive <> INVALID_HANDLE_VALUE) then

begin

8 Result := DeviceIoControl(hDrive,IOCTL_DISK_GET_DRIVE_GEOMETRY,nil,0,

@DiscGeometry,SizeOf(TDiscGeometry),junk,nil) and (junk = SizeOf(TDiscGeometry));

DiscGeometryShow();

9 end

else

begin

10 ShowMessage(не удалось создать дескрипторы дисков);

11 exit;

end;

12 end;

Рисунок 4.2 Потоковый граф обработчика события «С1» которое происходит при нажатии на кнопку «Начать работу с диском»

Цикломатическая сложность потокового графа:

1) V(G) = 4 регионов;

2) V(G) = 14 дуга - 12 узлов + 2 = 4;

3) V(G) = 3 предикатных узлов +1 = 4.

Путь 1:1-2-4-6-7-10-11-12;

Путь 2:1-2-3-4-6-7-10-11-12.

Путь 3: 1-2-4-5-6-7-10-11-12.

Путь 4:1-2-3-4-5-7-8-9-12.

пути

Исходные данные

Ожидаемые результаты

Реальные результаты

1

Дескрипторы файлов не созданы .

Невозможно получить данные о носителе вывод сообщения: «Не удалось создать дескрипторы файлов»

Вывод сообщения

«Не удалось создать дескрипторы файлов»

2

Создан дескриптор файла BPB

Невозможно получить данные о носителе вывод сообщения: «Не удалось создать дескрипторы файлов»

Вывод сообщения

«Не удалось создать дескрипторы файлов»

3

Создан дескриптор файла MBR

Невозможно получить данные о носителе вывод сообщения: «Не удалось создать дескрипторы файлов»

Вывод сообщения

«Не удалось создать дескрипторы файлов»

4

Дескрипторы файлов существуют как MBR так и BPB

Загрузка данных о носителе.

Загрузка данных о носителе.

3) Тестирование процедуры считывающей блок параметров Bios - событие «С2» (происходит при нажатии на кнопку «Считать BPB»)логического диска

дескриптор которого был создан в процедуре обрабатывающей событие «С1» при нажатии на кнопку «Начать работу с диском»

1инициализация

2IfReadSectors(hDrive,0,1,@buffer,DiscGeometry.BytesPerSector) = DiscGeometry.BytesPerSector then

begin

3for i:= 1 to 16 do

4Grid1.Cells[i,0]:=intToHex((i-1),1);

5i:=1; j:=1; k:=1;

6while k<=DiscGeometry.BytesPerSector do

begin

7 if i=1 then

8 Grid1.Cells[0,j]:=IntToHex(((j-1)*16+(i-1)),3);

9 Grid1.Cells[i,j]:=IntToHex(Buffer[k],2);

inc(k);

inc(i);

10 if i>16 then

begin

11 i:=1;

j:=j+1;

Grid1.RowCount:= Grid1.RowCount+1;

12end;

13end;

14{линейный блок расшифровки данных BPB}

end

else

15ShowMessage(`не удалось считать BPB);

16end

17end;

программа многопоточный приложение служебный

Рисунок 4.3 - Потоковый граф обработчика события С2 (Считывание блока параметров Bios).

Цикломатическая сложность потокового графа:

1) V(G) = 6 регионов;

2) V(G) = 21дуг - 17 узлов + 2 = 6;

3) V(G) = 5 предикатных узлов +1 = 6.

Путь 1:1-2-15-16-17;

Путь 2:1-2-3-4-5-6-7-9-10-12-13-14-17.

Путь 3: 1-2-3-4-5-6-7-8-9-10-12-13-14-16-17.

Путь 4:1-2-3-4-5-6-7-9-10-11-12-13-14-16-17.

Путь 5:1-2-3-4-5-6-7-8-9-10-11-12-13-14-16-17.

Путь 6: 1-2-3-4-3-4-5-6-7-9-10-12-13-6-7-8-9-10-11-12-13-14-16-17.

пути

Исходные данные

Ожидаемые результаты

Реальные результаты

1

Не удалось считать сектор BPB .

Вывод сообщения о том, что считать BPB не удалось

Вывод сообщения: « не удалось считать BPB»

2

Часть данных считана , при этом номер строки остаётся прежним и номер элемента строки не достиг 16.

Вывод данных в таблицу, содержащую данные о BPB,например команду перехода на программу загрузки: «EB0090h»

Вывод данных в таблицу, содержащую данные о BPB: команда перехода на программу загрузки: «EB0090h»

3

Чтение данных началось и строка получила значение

Вывод данных в таблицу, содержащую данные о BPB,например команду перехода на программу загрузки: «EB0090h»

Вывод данных в таблицу, содержащую данные о BPB: команда перехода на программу загрузки: «EB0090h»

4

Строка считана и номер элемента в строке достиг 16

Вывод данных в таблицу, содержащую данные о BPB,например команду перехода на программу загрузки: «EB0090h»

Вывод данных в таблицу, содержащую данные о BPB: команда перехода на программу загрузки: «EB0090h»

5

Строка получила номер и элемент в строке достиг 16

Вывод данных в таблицу, содержащую данные о BPB,например команду перехода на программу загрузки: «EB0090h»

Вывод данных в таблицу, содержащую данные о BPB: команда перехода на программу загрузки: «EB0090h»

6

Чтение данных из буфера в течении нескольких проходов циклов с изменением номера строк и столбцов таблицы , содержащей значения BPB

Пошаговый вывод данных в таблицу содержащую 16рмчные значения и вывод данных в таблицу содержащую расшифрованные значения

Обе таблицы «Шестнадцатиричное представление BPB логического диска» и «Расшифровка блока параметров BIOS» заполняются необходимыми значениями

4) Тестирование процедуры, считывающей таблицу разделов носителя(событие «С3» - происходит при нажатии на кнопку «Считать Partition Table»), к которому принадлежит ,выбранный из выпадающего списка логический диск

1инициализация.

2Memo2.Clear;

3If.ReadSectors(hMBRDrive,0,1,@buffer,DiscGeometry.BytesPerSector)= DiscGeometry.BytesPerSector then

begin

4for i:= 1 to 16 do

5Grid2.Cells[i,0]:=intToHex((i-1),1);

6i:=1; j:=1; k:=1;

7while k<=DiscGeometry.BytesPerSector do

begin

8if i=1 then

9Grid2.Cells[0,j]:=IntToHex(((j-1)*16+(i-1)),3);

10Grid2.Cells[i,j]:=IntToHex(Buffer[k],2);

inc(k);

inc(i);

11if i>16 then

begin

12 i:=1;

j:=j+1;

Grid2.RowCount:= Grid2.RowCount+1;

13 end;

14end;

begin

15{Линейный блок расшифровки значений полученных в буфере после чтения сектора}

16end

else

17ShowMessage(Не удалось считать блок PartitionTable);

18end;

Рисунок 4.4 - Потоковый граф обработчика события «С3» (кнопка «Считать PartitionTable »)

Цикломатическая сложность потокового графа:

1) V(G) = 6 регионов;

2) V(G) = 22 дуга - 18 узлов + 2 = 6;

3) V(G) = 5 предикатных узлов +1 = 6.

Путь 1:1-2-17-18;

Путь 2:1-2-3-4-5-6-7-8-10-11-13-14-15-16-18;

Путь 3:1-2-3-4-5-6-7-8-9-10-11-13-14-15-16-18;

Путь 4: 1-2-3-4-5-6-7-8-10-11-12-13-14-15-16-18;

Путь 5: 1-2-3-4-5-4-5-6-7-8-9-10-11-13-14-15-16-18;

Путь 6: 1-2-3-4-5-4-5-6-7-8-10-11-12-13-14-7-8-9-10-11-13-14-15-16-18;

№ пути

Исходные данные

Ожидаемые результаты

Реальные результаты

1

Если не удалось считать Partition Table

Должно появиться сообщение о том , что не возможно считать Partition Table

Вывод сообщения:

«Не удалось считать Partition Table»

2

Происходить считывание элемента массива , который имеет номер отличающийся от 1 и от 16.

Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»

Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»

3

Считывание элемента массива , который имеет номер 1 в строке таблицы

Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»

Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»

4

Считывание элемента, который имеет последний номер в строке (16)

Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»

Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»

5

Считывание данных из массива. При прохождении этого пути проверяется заполнение верхней строчки таблицы номерами от 0 до F.

Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»

Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»

6

Считывание данных из массива. Когда элемент имеет номер 16 в строке, а последующий элемент имеет номер 1 в след. строке.

Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»

Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»

Дополнительный тест

Тестирование алгоритма работы потока, который также относится к основному заданию курсового проекта.

1инициализация.

2while (not terminated) do

begin

3 WaitForSingleObject(Form1.HEvent, INFINITE);

4 ResetEvent(Form1.HEvent);

5 try

// резерв. память в потоке для этотой проекции

6PBaseAdress:=MapViewOfFile(Form1.HFileSender, FILE_MAP_READ,0,0,65536);

7 if (PBaseAdress = nil) then

begin

8 CloseHandle(Form1.HFileSender);

st:=не удалось отобразить файл на адресное пространство;

Application.MessageBox(st,Сообщение...,MB_OK);

form1.BitBtn2.Visible:=false;

form1.Button1.Visible:=false;

9 exit;

10end;

11 nlineSize:=integer(PBaseAdress^);

SetLength(TextString,nlineSize);

CopyMemory(PChar(TextString),Pointer(Integer(PBaseAdress)+4),nlineSize);

Form1.Memo1.Text:=Form1.Memo1.Text+---------+#13#10;

Form1.Memo1.Text:=Form1.Memo1.Text+TextString+#13#10;

sendmessage(Form1.memo1.handle, em_linescroll, 0, Form1.memo1.lines.count-1);

UnmapViewOfFile(PBaseAdress);

finally

12end;

13end;

Рисунок 4.5 - Потоковый граф обработчика потока(данный обработчик выполняется постоянно после запуска программы и если не была нажата кнопка «отсоединится при работе программы»)

Цикломатическая сложность потокового графа:

1) V(G) = 3 регионов;

2) V(G) = 14 дуг - 13 узлов + 2 = 3;

3) V(G) = 2 предикатных узлов +1 = 3.

Путь 1:1-2-3-4-5-6-7-8-9-13;

Путь 2:1-2-3-4-5-6-7-10-11-12-13;

Путь 3:1-2-3-4-5-6-7-8-9-10-11-12-2-3-4-5-6-7-10-11-12-13;

пути

Исходные данные

Ожидаемые результаты

Реальные результаты

1

Не удалось отобразить файл на адресное пространство в потоке.

Должно появиться сообщение : не удалось отобразить данные на адресное пространство потока

Вывод сообщения:

«Не отобразить файл на адресное пространство»

2

Ввод данных в поле сообщения и однократное нажатие на кнопку «отправить»

Вывод сообщения «отправить» в поле истории переписки.

Сообщение введённое в поле сообщений «отправить» появилось в поле истории переписки.

3

Ввод сообщения в поле сообщений и нажатие на кнопку «отправить» с последующим повторение этих действий

Вывод сообщения «отправить» в поле истории переписки.

Сообщение введённое в поле сообщений «отправить» появилось в поле истории переписки.

3.6.2 Тестирование методом черного ящика

1) Тестирование процедуры, выполняющей запись данных в проецируемый файл

(Рисунок 4.6. ).

(Этап выполнения программы 2 «Событие 1»).

Предусловие : Текст сообщения должен быть обязательно введён.

Постусловие: Если проекция файла создана, и объект типа поток сработал нормально, то вывод текста сообщения в поле истории переписки.

Рисунок 4.6 - Дерево разбиений для события «Событие1» (первое задание)

№ листа

Исходные данные

Ожидаемые результаты

Реальные результаты

1

Сообщение не введено

Никаких действий не должно происходить, программа не должна отвечать на действия такого рода

Программа никак не реагирует

2

Проекция файла не создана

Вывод сообщения: «Не удалось передать данные»

Вывод сообщения: «Не удалось передать данные»

3

Поток не сработал

Вывод сообщения : «Не удалось создать проекцию файла»

Вывод сообщения : «Не удалось создать проекцию файла»

4

В поле ввода сообщения введено : «СЛОВО»

Вывод сообщения с содержимым «СЛОВО» в поле истории переписки

В поле истории появится сообщение с текстом :

«<имя введённое при авторизации> написал :

СЛОВО»

2) Тестирование процедуры выполняющей создание дескрипторов носителя с которым ведётся работа (Рисунок 4.7).

(Этап выполнения программы 3 , событие С1).

Предусловие: Программа должна быть запущена от имени администратора.

Постусловие: 1 Должен быть выбран присутствующий носитель.

2 Если дескрипторы файлов успешно созданы и данные прочитаны в буфер, то- вывод информации в таблицы.

Рисунок 4.7 Дерево разбиений для процедуры, выполняющей создание дескрипторов носителя(Этап выполнения программы 3 события C1).

листа

Исходные данные

Ожидаемые результаты

Реальные результаты

1

Программа запущена не от имени администратора

Заполнение таблиц ,содержащих данные о BPB и данные о Partition Table нулевыми значениями.

Заполнение таблиц нулевыми значениями

2

Выбран носитель отсутствующий в списке активных носителей

Заполнение таблиц ,содержащих данные о BPB и данные о Partition Table нулевыми значениями.

Заполнение таблиц нулевыми значениями

3

Если не удалось создать дескрипторы файлов, отождествляющих жёсткий и логический диски.

Вывод сообщения :

«Не удалось создать дескрипторы носителя»

Вывод сообщения :

«Не удалось создать дескрипторы носителя»

4

Выбран активный носитель и дескрипторы носителя успешно созданы.

Вывод данных о блоке параметров Bios , Partition Table и расшифрованных значений в специальные таблицы.

Заполнение таблиц всеми необходимыми данными о носителе.

3)Тестирование процедуры, выполняющей считывание блока параметров Bios (Рисунок 4.8).

(Этап выполнения программы 3 , событие «С2»).

Предусловие: Дескрипторы должны быть созданы.

Постусловие: Файловая система должна быть FAT32.

Рисунок 4.8 -Дерево разбиений для процедуры, выполняющей считывание блока BPB для выбранного носителя.

листа

Исходные данные

Ожидаемые результаты

Реальные результаты

1

Дескрипторы не созданы.

Вывод сообщения «Не удалось считать блок параметров Bios»

Вывод сообщения «Не удалось считать блок параметров Bios»

2

Файловая система отличается от FAT32.

Заполнение таблицы расшифровки BPB неверными значениям , например : «Количество FAT : 0»

Заполнение таблицы содержащей расшифрованные данные о BPB неверными значениям: «Количество FAT : 0»

3

Файловая система FAT32

Заполнение таблицы расшифровки верными значениями, например: «количество FAT : 2»

Заполнение таблицы расшифровки верными значениями: «количество FAT : 2»

4)Тестирование процедуры, считывающей таблицу разделов жёсткого диска(Рисунок 4.9).

(Этап выполнения программы 3 , событие «С3»).

Предусловие: Программа должна быть запущена от имени администратора.

Постусловие: Дескрипторы должны быть созданы.

Рисунок 4.9 - Дерево разбиений для процедуры считывающей таблицу разделов носителя.

листа

Исходные данные

Ожидаемые результаты

Реальные результаты

1

Программа запущена не от имени администратора.

Заполнение полей таблицы расшифровки нулевыми значениями.

Заполнение полей таблицы расшифровки нулевыми значениями.

2

Дескрипторы не созданы

Вывод сообщения:

«Не удалось считать PartitionTable»

Вывод сообщения:

«Не удалось считать PartitionTable»

3

Дескрипторы созданы

Заполнение таблицы расшифровки верными значениями, например: «Размер раздела {: 61432497 }»

Заполнение таблицы расшифровки верными значениями «Размер раздела {: 61432497 }»

5)Тестирование процедуры работы потока.(Рисунок 4.10).

Предусловие: 1.Поток должен быть запущен.

2.Средства синхронизации созданы.

Постусловие: Файл проецируемый в память должен быть успешно создан.

Рисунок 4.10 - Дерево разбиений для процедуры работы потока.

листа

Исходные данные

Ожидаемые результаты

Реальные результаты

1

Средства синхронизации не созданы.

Вывод сообщения «не удалось осуществить обмен сообщениями»

Вывод сообщения «не удалось осуществить обмен сообщениями»

2

Проекция файла не создана.

Вывод сообщения «не удалось отобразить файл на адресное пространство»

Вывод сообщения «не удалось отобразить файл на адресное пространство»

3

Проекция файла создана.

Было введено сообщение

«Отправлено»

Вывод сообщения :

«Отправлено»

Вывод сообщения :

«Отправлено»