Разработка программного продукта
Анализ требований
Программный продукт для данного курсового проекта разработан на основе каскадной модели жизненного цикла программного продукта, поэтому первым этапом в разработки будет являться анализ требований к продукту.
В рамках анализа требований проведено исследование программы, вследствие чего определены входные и выходные данные, структурная схема программного продукта, рассмотрен интерфейс приложения. Данная система должна быть универсальной, простой и доступной, включать несколько типов тестовых заданий.
Программа должна обеспечивать:
- возможность создания и изменения тестов;
- добавление, изменение и удаление тестовых заданий из банка тестовых заданий;
- разграничение прав доступа при работе с программой (иметь административную и пользовательскую части);
- возможность добавления и удаления пользователей;
- возможность хранения результатов тестирования и формирования отчетов по итогам тестирования;
- возможность проведения тестирования по локальной сети
Проектирование модели
Проектирование программного обеспечения — процесс создания проекта программного обеспечения. Целью проектирования является определение внутренних свойств системы и детализации её внешних (видимых) свойств на основе выданных заказчиком требований (исходные условия задачи).
Стадии разработки программного обеспечения используются для описания степени готовности программного продукта. Также стадия разработки может отражать количество реализованных функций, запланированных для определённой версии программы. Стадии либо могут быть официально объявлены и регламентируются разработчиками, либо иногда этот термин используется неофициально для описания состояния продукта.
Начальная стадия разработки — период времени со старта разработки до выхода стадии Альфа (или до любой другой, если стадии Альфа нет).
Также так называются программы, не вышедшие еще в стадию альфа или бета, но прошедшие стадию разработки, для первичной оценки функциональных возможностей в действии.
В отличие от альфа и бета
версий, пре-альфа может включать в себя не весь спектр функциональных возможностей программы.
В этом случае, подразумеваются все действия выполняемые во время проектирования и разработки программы вплоть до тестирования. К таким действиям относятся — разработка дизайна, анализ требований, собственно разработка приложения, а также отладка отдельных модулей.
Внутреннее (альфа) тестирование — стадия начала тестирования программы в целом специалистами-тестерами, обычно не разработчиками программного продукта, но, как правило, внутри организации или сообществе разрабатывающих продукт. Также это может быть стадия добавления новых функциональных возможностей. Программы на данной стадии могут применяться только для ознакомления с будущими возможностями.
Публичное (бета) тестирование — стадия активного бета-тестирования и отладки программы, прошедшей альфа-тестирование (если таковое было). Программы этого уровня могут быть использованы другими разработчиками программного обеспечения для испытания совместимости. Тем не менее, программы этого этапа могут содержать достаточно большое количество ошибок. Поскольку бета-продукт не является финальной версией, и публичное тестирование производится на страх и риск пользователя, производитель не несёт никакой ответственности за ущерб, причинённый в результате использования бета-версии.
Релиз-кандидат — стадия-кандидат на то, чтобы стать стабильной. Программы этой стадии прошли комплексное тестирование, благодаря чему были исправлены все найденные критические ошибки. Но в то же время существует вероятность выявления ещё некоторого числа ошибок, не замеченных при тестировании.
Релиз — издание продукта, готового к тиражированию. Это стабильная версия программы, прошедшая все предыдущие стадии, в которых исправлены основные ошибки, но существует вероятность появления новых, ранее не замеченных, ошибок.
Пост-релиз - издание продукта, у которого есть несколько отличий от релиза и помечается как самая первая стадия разработки следующего продукта. Такие релизы не выпускаются на продажу, а раздаются бета-тестерам. Это издание может быть либо стабильным (если не замечено ошибок), либо с ошибками. [1]
Реализация
В ходе реализации создан графический интерфейс приложения и написан код программы, реализующий все её функции.
Далее представлены фрагменты кода, осуществляющие основные функции программы «Универсальная система проверки остаточных знаний ».
Создание и редактирование тестов:
В начале работы преподаватель создает перечень необходимых дисциплин и дидактических единиц. Этот перечень сохраняется в файлах dis.txt и testname.txt соответственно. На листинге 1 приведен код программы, обеспечивающий связь с этими файлами.
Листинг 1 – Создание теста
if ((Edit1.Text<>'') And (Edit1.Text<>' ')) then
…
if Res1='test' then
begin
{$I-}
Form2.ComboBox2.AddItem(Edit1.Text,Form2.ComboBox2);
Form2.ComboBox2.SelText:=Edit1.Text;
AssignFile (FileName,'testname.txt');
Append (FileName);
str:=Form2.combobox1.text;
Writeln(FileName,str);
str:=Edit1.Text;
WriteLn(FileName,str);
str:=ID_PREP;
Writeln(FileName,str);
CloseFile(FileName);
{$I+}
end
else
if Res1='dis' then
begin
Form2.ComboBox1.AddItem(Edit1.Text,Form2.ComboBox1);
AssignFile (FileName,'dis.txt');
Form2.combobox1.Text:=Edit1.Text;
Append (FileName);
str:=Edit1.text;
WriteLn(FileName,str);
CloseFile(FileName);
end…
Редактирование тестовых заданий:
При редактировании тестовых заданий, каждое из них описывается в виде структуры представленной на листинге 2.
Листинг 2 – Структура хранения данных
type test= Record
prep:String[20]; test:String[20]; pred:String[20]; vop:String[255];
kol_otv:Integer;
otv1:String[80]; otv2:String[80]; otv3:String[80];
otv4:String[80]; otv5:String[80]; otv6:String[80];
nom_pr:Integer;
isRight1:Boolean; isRight2:Boolean; isRight3:Boolean;
isRight4:Boolean; isRight5:Boolean; isRight6:Boolean;
Set1:Boolean; Set2:Boolean; Set3:Boolean;
Set4:Boolean; Set5:Boolean; Set6:Boolean;
End;
Строковые атрибуты структуры предназначены для хранения тестового задания с вариантами ответов, целочисленные – для хранения количества правильных ответов и номера правильного, логические – для указания правильных ответов в случае множественного выбора и для запоминания ответов, выбранных тестирующимся.
Во время редактирования или создания теста все тестовые задания хранятся в программе в массиве структур. При навигации по тестовым заданиям (при переходе на другой вопрос) выполняется процедура автоматического сохранения внесенных изменений (листинг 3).
Листинг 3 – Процедура автоматического сохранения
procedure Saver(); …
with Form3 do
begin …
for i:=1 To vop.Lines.Count-1 do
begin
tmp_str:=tmp_str+vop.Lines.Strings[i-1]+' ';
end;
…
for i:=1 To otv1.Lines.Count-1 do
tmp_str:=tmp_str+otv1.Lines.Strings[i-1]+' ';
tmp_str:=tmp_str+otv1.Lines.Strings[otv1.Lines.Count-1];
loading_test[current_test].otv1:=tmp_str;
…
for i:=1 To otv5.Lines.Count-1 do
tmp_str:=tmp_str+otv5.Lines.Strings[i-1]+' ';
tmp_str:=tmp_str+otv5.Lines.Strings[otv5.Lines.Count-1];
loading_test[current_test].otv5:=tmp_str;
loading_test[current_test].isRight1:=CheckBox1.Checked;
loading_test[current_test].isRight2:=CheckBox2.Checked;
loading_test[current_test].isRight3:=CheckBox3.Checked;
…
End;
Одной из важнейших процедур программы является загрузка тестовых заданий на форму (листинг 3). Тестовые задания считываются из соответствующей структуры данных, расположенной в файле.
Листинг 3 – Загрузка тестового задания
procedure showtest();
begin
with form3 do
begin
label10.Caption :='Вопрос №'+IntToStr(current_test)+' из '+IntToStr(test_count);
vop.Text:=loading_test[current_test].vop;
otv1.Text:=loading_test[current_test].otv1;
…
CheckBox1.Checked := loading_test[current_test].isRight1;
Разграничение прав доступа при работе с программой
Работа с конструктором тестовых заданий осуществляется лицами двух категорий: преподавателями (создают или редактируют тесты) или администратором (ведет учет преподавателей).
Пароли хранятся в зашифрованном виде в файле login.txt. Для шифрования применяется метод инвертирования (каждый бит меняется на противоположный) На листинге 4 представлена процедура сохранения пароля в файл.
Листинг 4 – Сохранение пароля
AssignFile (FileName,'login.txt');
Rewrite (FileName);
i:=0;
while (i<UserCount) do
begin
inc(i);
str:=User[i];
str:=ConvertStr(str);
Writeln (FileName,str);
str:=Pass[i];
str:=ConvertStr(str);
Writeln (FileName,str);
end;
CloseFile(FileName);
Добавление и удаление пользователей
Основная функция администратора системы – производить добавление и удаление пользователей. При удалении пользователей, созданные им файлы тестов продолжают храниться на диске. Передача тестовых заданий другому преподавателю может быть осуществлена администратором вручную путем изменения имени файла теста, которое состоит из фамилии и инициалов преподавателя, название дисциплины и дидактической единицы. Фрагмент процедуры удаления приведен на листинге 5.
Листинг 5 – Удаление пользователя
…
if Res1='test' then
begin
{$I-}
AssignFile (FileName,'testname.txt');
AssignFile (NewFile,'tmp.txt');
Reset(FileName);
Rewrite(NewFile);
while (not (eof(FileName))) do
begin
ReadLn(FileName,Dis);
ReadLn(FileName,Test);
ReadLn(FileName,Users);
… WriteLn(NewFile,Test);
WriteLn(NewFile,Users);
end;
end;
…
DeleteFile('testname.txt');
RenameFile('tmp.txt','testname.txt');
str:=ID_PREP+Form2.ComboBox1.Text+Form2.ComboBox2.Text;
DeleteFile(CURDIR+'\tests\'+str);
Form2.ComboBox2.DeleteSelected;
{$I+}
Form2.ComboBox2.Text:='';
end
else
begin
For i:=Form1.ListBox1.ItemIndex+1 to UserCount-1 do
begin
User[i]:=User[i+1];
Pass[i]:=Pass[i+1];
end;
Form1.ListBox1.DeleteSelected;
dec(UserCount);
Saver();
Form1.BitBtn3.Enabled:=False;
Form1.BitBtn4.Enabled:=False;
end;
Res1:='';
DelForm.Close;
end;
Описание модуля тестирования:
Модуль тестирования предназначен для прохождения обучающимися тестов и составлением протокола тестирования. Он содержит несколько основных функций:
1) загрузка теста;
2) навигация по тесту;
3) составление протокола тестирования;
4) сохранение протокола;
5) печать протокола.
Загрузка теста:
После заполнения информации о тестирующемся (фамилия, имя, название студенческой группы), отображается окно выбора теста. Здесь необходимо указать название дисциплины и дидактическую единицу. После этого осуществляется открытие главной формы и загрузка теста (листинг 6).
Листинг 6 – Отображение теста
current_test:=1;
test_count:=0;
i:=1;
while ID_TEST[i]<>ComboBox2.Text do inc(i);
{$I-}
str:='tests\'+ID_PREP[i]+ComboBox1.Text+ComboBox2.Text;
AssignFile (file_name,str);
Reset(file_name);
while not(Eof(file_name)) do
begin
inc(test_count);
read(file_name,loading_test[test_count]);
AllTime:=strtoint(loading_test[test_count].time);
btn[test_count]:=TPanel.Create(form3);
btn[test_count].Parent:=Form1.Panel8;
btn[test_count].Name:='b' + inttostr(test_count);
btn[test_count].Caption:=inttostr(test_count);
btn[test_count].Visible:=true;
btn[test_count].Width:=25;
btn[test_count].Top:=0;
btn[test_count].Left:=26*(test_count-1);
btn[test_count].Height:=Form1.Panel8.Height;
btn[test_count].OnClick := Form1.Panel8Click ;
btn[test_count].Color:= clSilver;
btn[test_count].Font.Size:=10;
btn[test_count].Font.Style:=[fsBold];
end;
showtest;
CloseFile (file_name);
CURDIR:=GetCurrentDir;
{$I+}
AllTime:=AllTime*60;
Form1.Show;
Form5.Hide;
Form1.Timer1.Enabled:=True;
Form1.Label1.Caption:='Тест по дисциплине "'+ComboBox1.Text+'" на тему "' +ComboBox2.Text+'"';
end;
Навигация по тесту:
Для перехода на вопрос можно использовать два инструмента:
1) кнопки движения (на первый вопрос, на предыдущий вопрос, на следующий вопрос, на последний вопрос);
2) кнопку с номером нужного вопроса.
В обоих случаях происходит установка переменной, отвечающей за номер текущего вопроса в нужное значение и вызов процедуры отображения вопроса (листинг 7).
Листинг 7 – Отображение вопроса
with form1 do
begin
label2.Caption :='Вопрос №'+IntToStr(current_test)+' из '+IntToStr(test_count);
vop.Caption :=loading_test[current_test].vop;
otv1.Caption:=loading_test[current_test].otv1;
otv2.Caption:=loading_test[current_test].otv2;
…
otv1.OnClick(otv1);
otv2.OnClick(otv1);
otv3.OnClick(otv1);
…
end;
Составление протокола тестирования:
По результатам тестирования на форму выводится протокол. Исходными данными для функции составления протокола (листинг 8) служат заполненные поля стартовой формы, номера выбранных ответов и номера правильных ответов по каждому вопросу тестового задания.
Листинг 8 – Составление протокола тестирования
var M,S:Integer;
per:Real;
str:String;
begin
Dec(AllTime);
M:= AllTime div 60;
S:= AllTime mod 60;
BitBtn1.Caption:='Завершить тестирование (осталось '+IntToStr(M)+' мин. '
+IntToStr(S)+' сек.)';
if(AllTime=0)then
begin
Timer1.Enabled:=False;
if test_count<>0 then per:=right_count/test_count;
if per>0.85 then str:='Отлично!'
else if per>0.6 then str:='Хорошо!'
else if per>0.45 then str:='Удовлетворительно!'
else str:='Неудовлетворительно!';
Form4.Memo1.Lines.Clear;
Form4.Memo1.Lines.Add('Протокол тестирования.');
Form4.Memo1.Lines.Add('');
Form4.Memo1.Lines.Add('Студент: '+Form3.Edit1.Text+' '+Form3.Edit2.Text);
Form4.Memo1.Lines.Add('Группа: '+Form3.Edit3.Text);
Form4.Memo1.Lines.Add('Дисциплина: '+Form5.ComboBox1.Text);
Form4.Memo1.Lines.Add('Дидактическая единица: '+Form5.ComboBox2.Text);
Form4.Memo1.Lines.Add('Дата тестирования: '+DateToStr(SysUtils.Date));
Form4.Memo1.Lines.Add('');
Form4.Memo1.Lines.Add('Число заданных вопросов: '+inttostr(test_count));
Form4.Memo1.Lines.Add('Число правильных ответов: '+inttostr(right_count));
Form4.Memo1.Lines.Add('Ваша оценка: '+str);
Form6.Memo1.Lines.Clear;
Form6.Memo1.Lines.Add('Протокол тестирования.');
Form6.Memo1.Lines.Add('');
Form6.Memo1.Lines.Add('Студент: '+Form3.Edit1.Text+' '+Form3.Edit2.Text);
Form6.Memo1.Lines.Add('Группа: '+Form3.Edit3.Text);
Form6.Memo1.Lines.Add('Дисциплина: '+Form5.ComboBox1.Text);
Form6.Memo1.Lines.Add('Дидактическая единица: '+Form5.ComboBox2.Text);
Form6.Memo1.Lines.Add('Дата тестирования: '+DateToStr(SysUtils.Date));
Form6.Memo1.Lines.Add('');
Form6.Memo1.Lines.Add('Число заданных вопросов: '+inttostr(test_count));
Form6.Memo1.Lines.Add('Число правильных ответов: '+inttostr(right_count));
Form6.Memo1.Lines.Add('Ваша оценка: '+str);
form1.Hide;
Form2.Close;
Form4.Show;
Сохранение и печать протокола:
Сохранение и печать протокола выполняются стандартными функциями Delphi SaveToFile для структуры lines объекта Memo и Print объекта Form (листинг 9).
Листинг 9 – Сохранение и печать протокола
if SaveDialog1.Execute then
begin
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
ShowMessage('Сохранение произведено!');
end;
… Form6.Print;
Тестирование
Тестирование — это процесс анализа ПО, направленный на выявление отличий между его реально существующими и требуемыми свойствами (дефект) и на оценку свойств ПО. [10]
По ГОСТ Р ИСО МЭК 12207-99 в жизненном цикле ПО определены среди прочих вспомогательные процессы верификации, аттестации, совместного анализа и аудита. Процесс верификации является процессом определения того, что программные продукты функционируют в полном соответствии с требованиями или условиями, реализованными в предшествующих работах.
Данный процесс может включать анализ, проверку и испытание (тестирование). Процесс аттестации является процессом определения полноты соответствия установленных требований, созданной системы или программного продукта их функциональному назначению. Процесс совместного анализа является процессом оценки состояний и, при необходимости, результатов работ (продуктов) по проекту. Процесс аудита является процессом определения соответствия требованиям, планам и условиям договора. В сумме эти процессы и составляют то, что обычно называют тестированием.
Тестирование основывается на тестовых процедурах с конкретными входными данными, начальными условиями и ожидаемым результатом, разработанными для определенной цели, такой, как проверка отдельной программы или верификация соответствия на определенное требование. Тестовые процедуры могут проверять различные аспекты функционирования программы — от правильной работы отдельной функции до адекватного выполнения бизнес-требований.
При выполнении проекта необходимо учитывать, в соответствии с какими стандартами и требованиями будет проводиться тестирование продукта.
Какие инструментальные средства будут (если будут) использоваться для поиска и для документирования найденных дефектов. Если помнить о тестировании с самого начала выполнения проекта, тестирование разрабатываемого продукта не доставит неприятных неожиданностей.
А значит и качество продукта, скорее всего, будет достаточно высоким. [11]
Вывод
В третьем разделе рассмотрены основные понятия и определения разработки программного продукта, его жизненный цикл и поэтапная разработка программы «Универсальная система проверки остаточных знаний». Код программы представлен на языке Borland Delphi 7. Отладка и тестирование продукта оказало полную его состоятельность, устойчивость к сбоям и корректную работу программы.