Как сделать тест в делфи
Создание тестов на Delphi. Часть 1
Сейчас подготовил серию уроков по созданию тестов на Delphi. Эта тема сейчас очень распространненая, так как много кто пишет курсовые по этим темам, дипломные и многое другое. Тех же самых сотрудников можно протестировать, так что эта тема очень распространненая. Предлагаю серию тестов с использованием файлов. Да с использованием БД — это хорошо, но если БД локальная, то дела все теже, что и с файлами. С БД я даже рассказывать не буду как делать, там вообще все просто, тем более я рассказал курс по работе с БД в Delphi. Так вот рассмотрим создание тестов используя два варианта. С использованием обычных файлов — dat, db или любой другой свой формат, а также с использованием ini-файлов. Скажу одно, что с использованием ini-файлов необходимо шифрование данных, я про него еще не рассказывал, но все как-нибудь доберусь. Шифрование нужно хотя бы для, того, чтобы пользователь, открыв файл не узнал правильный ответ, в dat-файле например, это можно кое-как скрыть и без шифрование, так что давайте попробуем для начала добавить данные в файл. То есть добавить (создать) наш тест. Для начала нам необходимо описать структуру, где будет храниться наш тест, а затем создать файл данной структуры.
Моя структура выглядит так
Исходный код |
Далее мы описываем файл данной стуктуры, затем саму стуктуру и начинаем запись. Я про файлы не рассказывал (а надо было, займусь этим попозже), тут есть набор функций и процедур по работе с файлами. На событие формы — OnCreate мы создаем наш файл тестов
Исходный код |
То есть у нас будут сколько угодно вариантов ответа и сколько угодно правильных ответов. Далее на кнопку добавления ответов в TChecklistBox я написал следующий код.
Исходный код |
То есть мы просто формируем наши ответы. Как Вам понятно у нас всего 3 вопроса, я первоначально нашей переменной присвоил это значение, может быть и меньше, но никаки больше. Далее я на кнопку записи вопроса в файл написал следующий код
Исходный код |
Как видите мы просто записываем в цикле наши оветы с вопросами, с количеством, то есть в одной строке все. В следующей статья я расскажу как считать из файла все эти вопросы, а затем поговорим как определить правильный ли вопрос выбрал пользователь или нет. Проект пока что не прилаживаю, так как выложу его в конечном итоге.
Создание тестирующих программ в среде программирования Delphi
Предлагаемые методические рекомендации отображают проектирование, оформление и разработку тестирующих программ в среде программирования Delphi.
Рекомендуются учителям информатики, учителям школьных предметов, учащимся старших классов общеобразовательных средних школ с углубленным изучением информатики.
Введение
Ощутимые шаги в раскрытии глубинных закономерностей человеческого обучения, сделанные мировой дидактикой, а также бурный прогресс в области развития персональных компьютеров выводят педагогов на необходимость создания электронных тестирующих программ для самоконтроля и самопроверки знаний обучающихся.
Основная цель данных методических рекомендаций состоит в том, чтобы дать знания о технологии создания тестирующих программ в среде программирования Delphi.
В результате использования этих рекомендаций могут быть сформированы умения и навыки проектирования тестирующих программ в среде программирования Delphi.
Создание тестирующей программы с использованием компонентов
TLabel, TButton, TRadioGroup
Создание интерфейса приложения
2. Задайте объектам следующие свойства
Объект | Свойство | Значение |
Форма | Name | Form1 |
Caption | Тест самопроверки | |
Color | cllnfoBk | |
RadioGroup | Name | RadioGroup1, :, RadioGroup5 |
Caption | — | |
Items | :(варианты ответов) | |
ItemIndex | 0,1,2,3 (индекс выбранного переключателя) | |
Font | Times New Roman, обычный, размер 14, цвет тёмно-синий | |
Label | ||
(метка) | Name | Label1. Label5 |
Caption | :(текст выбранного вопроса) | |
Font | Times New Roman, полужирный, размер 14, цвет тёмно-синий | |
Label | ||
(метка) | Name | Label4 |
Caption | — | |
Font | Times New Roman, полужирный, размер 14, цвет красный | |
Label | ||
(метка) | Name | Label5 |
Caption | — | |
Font | Times New Roman, полужирный, размер 14, цвет красный | |
Button | ||
(кнопка) | Name | Button1 |
Caption | Число правильных ответов | |
Button | ||
(кнопка) | Name | Button2 |
Caption | Выход |
Написание кода
1. Напишите программу теста в окне кода.
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin m:=0; if RadioGroup1.ItemIndex=1 then m:=m+1 else m:=m; end;
procedure TForm1.RadioGroup2Click(Sender: TObject);
begin n:=0; if RadioGroup2.ItemIndex=0 then n:=n+1 else n:=n; end;
procedure TForm1.RadioGroup3Click(Sender: TObject);
begin k:=0; if RadioGroup3.ItemIndex=0 then k:=k+1 else k:=k; end;
procedure TForm1.RadioGroup4Click(Sender: TObject);
begin w:=0; if RadioGroup4.ItemIndex=0 then w:=w+1 else w:=w; end;
procedure TForm1.RadioGroup5Click(Sender: TObject);
begin v:=0; if RadioGroup5.ItemIndex=2 then v:=v+1 else v:=v; end;
procedure TForm1.Button1Click(Sender: TObject);
begin l:=m+n+k+w+v; if l=5 then
begin Label4.Caption:=IntToStr(l); Label5.Caption:=’Отлично!’; end else if l=4 then
Написание кода
1. Запрограммируйте метку Label2 («Следующий вопрос») так, чтобы в метке Label1 выводился следующий вопрос, варианты ответа на него, и при достижении последнего вопроса метка Label2 становилась недоступной.
3.Напишите программу теста в окне кода.
a,b,c,d,f,g,j,l,m,n,k,p:integer; implementation uses Unit2;
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin a:=0; if RadioGroup1.ItemIndex=0 then a:=a+1 else a:=a; RadioGroup1.Visible:=False; end;
procedure TForm1.RadioGroup2Click(Sender: TObject);
begin b:=0; if RadioGroup2.ItemIndex=1 then b:=b+1 else b:=b; RadioGroup2.Visible:=False; end;
procedure TForm1.RadioGroup3Click(Sender: TObject);
begin d:=0; if RadioGroup3.ItemIndex=1 then d:=d+1 else d:=d; RadioGroup3.Visible:=False; end;
procedure TForm1.RadioGroup4Click(Sender: TObject);
begin c:=0; if RadioGroup4.ItemIndex=0 then c:=c+1 else c:=c; RadioGroup4.Visible:=False; end;
procedure TForm1.RadioGroup5Click(Sender: TObject);
begin f:=0; if RadioGroup5.ItemIndex=3 then f:=f+1 else f:=f; RadioGroup5.Visible:=False; end;
procedure TForm1.RadioGroup6Click(Sender: TObject);
begin g:=0; if RadioGroup6.ItemIndex=2 then g:=g+1 else g:=g; RadioGroup6.Visible:=False; end;
procedure TForm1.RadioGroup7Click(Sender: TObject);
begin j:=0; if RadioGroup7.ItemIndex=1 then j:=j+1 else j:=j; RadioGroup7.Visible:=False; end;
procedure TForm1.RadioGroup8Click(Sender: TObject);
begin l:=0; if RadioGroup8.ItemIndex=1 then l:=l+1 else l:=l; RadioGroup8.Visible:=False; end;
procedure TForm1.RadioGroup9Click(Sender: TObject);
begin m:=0; if RadioGroup9.ItemIndex=3 then m:=m+1 else m:=m; RadioGroup9.Visible:=False; end;
procedure TForm1.RadioGroup10Click(Sender: TObject);
begin n:=0; if RadioGroup10.ItemIndex=2 then n:=n+1 else n:=n; RadioGroup10.Visible:=False; end;
procedure TForm1.Label2Click(Sender: TObject);
1: begin Label1.Caption:=’2 вопрос. Массовое производство компьютеров началось в:’;
2: begin Label1.Caption:=’3 вопрос. Элементной базой процессоров ЭВМ 2-ого поколения являлись:’; RadioGroup3.Visible:=True; end;
3:begin Label1.Caption:=’4 вопрос. Какое устройство не предназначено для обработки информации?’; RadioGroup4.Visible:=True; end;
4:begin Label1.Caption:=’5 вопрос. За минимальную единицу измерения количества информации принят:’; RadioGroup5.Visible:=True; end;
5:begin Label1.Caption:=’6 вопрос. Сколько байтов занимает в памяти ПК слово ПОБЕДА?:’;
6:begin Label1.Caption:=’7 вопрос. Производительность работы компьютера зависит от:’;
7:begin Label1.Caption:=’8 вопрос. Какое устройство может оказывать вредное воздействие на здоровье человека?’; RadioGroup8.Visible:=True; end;
8:begin Label1.Caption:=’9 вопрос. При выключении компьютера вся информация стирается:’;
9:begin Label1.Caption:=’10 вопрос. В целях сохранения информации дискеты необходимо оберегать от:’; RadioGroup10.Visible:=True; Button2.Visible:=True;Label2.Visible:=False; end; end;
procedure TForm1.Button2Click(Sender: TObject);
begin p:= a+b+c+d+f+g+j+l+m+n; if p=10 then
begin Label1.Caption:=IntToStr(p)+’ правильных ответов из 10 вопросов.’+’ Отлично!’; end
begin Label1.Caption:=IntToStr(p)+’ правильных ответов из 10 вопросов.’+’ Хорошо!’; end
begin Label1.Caption:=IntToStr(p)+’ правильных ответов из 10 вопросов.’+’ Удовлетворительно.’;
end else if p
Объект | Свойство | Значение |
Форма | Name | Form1 |
Caption | Тестирующая программа по информатике | |
Color | clSkyBlue | |
MainMenu | Name | MainMenu1 |
Label | ||
(метка) | Name | Label1 |
Caption | — | |
Font | MS Sans Serif, полужирный курсив, размер 14, цвет красный | |
Label | ||
(метка) | Name | Label2. Label7 |
Caption | :(текст вопроса) | |
Font | MS Sans Serif, полужирный курсив, размер 12, цвет тёмно-синий | |
Button | ||
(кнопка) | Name | Button1 |
Caption | Выход | |
Font | MS Sans Serif, полужирный курсив, размер 14, цвет чёрный | |
Image | Name | Image1 |
Visible | True | |
Stretch | True | |
Picture | указать путь к рисунку | |
Panel | Name | Panel1. Panel6 |
Caption | 1,:6 | |
PageControl | Name | PageControl1 |
Active Pages | TabSheet1 | |
Visible | True | |
TabSheet1. TabSheet6 | Name | TabSheet1. TabSheet6 |
Caption | вопрос1. вопрос6 | |
RadioGroup | Name | RadioGroup1, :, RadioGroup6 |
Caption | — | |
Items | :(варианты ответов) | |
ItemIndex | 0,1,2,3 (индекс выбранного переключателя) |
Написание кода
2. Напишите программу теста в окне кода.
m,n,k,w,l,s,z:integer; implementation uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin n:=0; if RadioGroup1.ItemIndex=0 then begin n:=n+1; Panel1.Visible:=False; end else n:=n;
procedure TForm1.RadioGroup2Click(Sender: TObject);
begin m:=0; if RadioGroup2.ItemIndex=2 then begin m:=m+1;Panel2.Visible:=False; end else m:=m;
procedure TForm1.RadioGroup3Click(Sender: TObject);
begin k:=0; if RadioGroup3.ItemIndex=0 then begin k:=k+1; Panel4.Visible:=False; end else k:=k;
procedure TForm1.RadioGroup4Click(Sender: TObject);
begin w:=0; if RadioGroup4.ItemIndex=0 then begin w:=w+1; Panel3.Visible:=False; end else w:=w;
procedure TForm1.RadioGroup5Click(Sender: TObject);
begin s:=0; if RadioGroup5.ItemIndex=1 then begin s:=s+1; Panel5.Visible:=False; end else s:=s;
procedure TForm1.RadioGroup6Click(Sender: TObject);
begin z:=0; if RadioGroup6.ItemIndex=1 then begin z:=z+1; Panel6.Visible:=False; end else z:=z;
procedure TForm1.N3Click(Sender: TObject);
begin l:=m+n+k+w+s+z; Label1.Caption:=IntToStr(l)+’ правильных ответов из 6 вопросов’; end;
procedure TForm1.N4Click(Sender: TObject);
procedure TForm1.N7Click(Sender: TObject);
begin AboutBox.show; end;
procedure TForm1.N6Click(Sender: TObject);
begin MessageDlgPos(‘Будьте внимательны при выборе варианта ответа!
Повторный выбор ответа на вопрос недоступен!’,mtInformation,[mbOK],0,300,200); end; end.
3.Сохраните форму и проект в своей папке.
Литература
Юнит-тесты Delphi или разработка через тестирование
Разработка через тестирование в Delphi производится с помощью встроенного инструмента DUnit. В статье мы рассмотрим, как создаются тестовые проекты Delphi, как создавать юнит тесты и как тестировать.
Итак, сначала поговорим о том, что такое DUnit. DUnit – это инструмент тестирования с открытыми исходными кодами, основанный на JUnit. Доступен он как для Delphi, так и для C++.
Вообще, в состав Delphi этот инструмент включён начиная с Delphi 2005. Для Delphi и C++ Builder DUnit устанавливается автоматически установщиком RAD Studio. В папке \source\DUnit (внутри папки, куда установлен Delphi) вы можете найти много ресурсов, в том числе исходные файлы, документацию и примеры тестов. Поставляется DUnit под лицензией Mozilla Public License 1.1 (MPL).
В статье я не буду углубляться в теорию, а лишь покажу, как пользоваться инструментом DUnit в Delphi. Будем считать, что читатель знает, что такое разработка через тестирование.
Создание тестового проекта
Тестовый проект содержит один или несколько тестовых случаев, которые представляют из себя обычные .pas файлы и будут доступны в IDE на панели Project Manager. Также RAD Studio предоставляет в ваше распоряжение мастер создания тестового проекта «Test Project Wizard». Рекомендуется создавать два отдельных проекта: один тестируемый, а второй тестирующий. Так вам не придётся в будущем удалять ваши тесты из готового приложения.
На первом шаге мастера «Test Project Wizard» в поле «Source Project» можно указать тестируемый проект, если их несколько. В полях «Project Name» и «Location» указывается название и расположение тестового проекта. В поле «Personality» выбирается язык программирования (в нашем случае – это Delphi). Все перечисленные поля заполнились автоматически, что нам подходит. Галочку «Add to project group» оставьте, чтобы проект добавился в текущую группу проектов. Нажмите «Next >».
На следующем шаге можно выбрать, как будет выполняться тест (поле «Test Runner»): в окне («GUI») или в консоли («Console»). Оставим здесь предложенный по умолчанию вариант – «GUI». В поле «Test Framework» указываются инструменты тестирования. Поменять в этом поле ничего нельзя, т.к. для Delphi и C++ поддерживается только инструмент DUnit. Нажмите «Finish» и вы увидите, что в группе проектов появился новый пустой тестовый проект.
Тестовые случаи и тестирование
В типичном тестовом проекте, для каждого тестируемого класса есть тестирующий класс, но это не обязательно. Тестирующий класс также привязан к тестовому случаю. Как правило, тестирующий класс имеет набор из одного или нескольких методов, которые соответствуют одному или нескольким методам тестируемого класса. В один тестовый проект могут быть включены несколько тестовых случаев. Запуск каждого тестового случая и тестового проекта может быть автоматизирован с помощью bat-файлов или скриптов сборки проекта.
В основном рекомендуется создавать тесты в отдельном проекте (отдельно от тестируемого проекта). Так вам не нужно будет удалять тесты из проекта перед финальной сборкой проекта.
RAD Studio предоставляет вам мастер «Test Case Wizard» для помощи в создании тестовых случаев, которые вы сможете настроить на своё усмотрение.
Прежде чем сделать тестовый случай, давайте определимся, что мы будем тестировать. В тестируемом проекте Project1, который мы создали, есть форма. Давайте её и будем тестировать. Допустим, наша форма будет построчно сравнивать два текстовых файла и показывать строки с различиями. Сравнивать будем двумя способами: учитывая регистр и без учёта регистра. Код для теста сделаем элементарный, будем сравнивать строки с одинаковыми индексами.
Итак, на форму ставим два текстовых поля TRichEdit и две кнопки TButton. Затем обрабатываем события от нажатий кнопок и дописываем код следующим образом:
Как видите, по нажатию на кнопки будут вызываться две процедуры Compare и ShowDifferences. Первая процедура будет сравнивать два текста и сохранять индексы несовпадающих строк в список differentStrings, а вторая процедура будет на основе этого списка подкрашивать несовпадающие строки в красный цвет. В процедуру Compare будет передаваться параметр ignoreCase определяющий способ сравнения строк. Пока реализацию функции Compare делать не будем, а сразу сделаем тест для неё.
Для создания тестов нужно сделать следующие шаги:
После этого вы увидите, что в тестовом проекте появился файл «TestUnit1.pas» и в этот же проект добавлен тестируемый юнит «Unit1.pas».
А вот что вы увидите в файле TestUnit1.pas:
Как видите, здесь сделана заготовка для тестирующего класса TestTForm1, унаследованного от класса TTestCase. В секции initialization происходит регистрация этого класса.
В методе SetUp происходит подготовка к тестированию. Здесь нужно создать тестируемый класс и подготовить всё что нужно для тестов, например, подключиться к удалённому серверу или базе данных и т.п. Кстати здесь код сгенерирован с ошибкой: конструктор формы должен принимать входной параметр. Исправим строку кода с созданием формы следующим образом:
Метод TearDown вызывается по окончании тестирования и здесь нужно освободить все ресурсы и удалить все созданные объекты. Здесь сгенерированный код нас устраивает.
Метод TestCompare создан как раз для тестирования нашего метода Compare. Как видите, здесь вызывается наш метод Compare, но нет никаких проверок. Давайте добавим здесь в текстовые поля одинаковый текст, вызовем метод Compare и сделаем проверку результата.
Теперь давайте исправлять ошибки, чтобы тестирование прошло успешно. Допишите функцию сравнения следующим образом:
В методе тестирования добавим тесты для разных вариантов сравнения:
Теперь протестируем нашу функцию Compare. Как видите, всё работает правильно, ошибок нет.
Помимо метода CheckEquals в вашем распоряжении есть и другие методы для проверки результатов. Вот основные методы, которые вам могут понадобиться:
Тестирование приватных методов
Отдельно хотелось бы показать, как тестировать приватные методы. Для вызова приватных методов в Delphi мы воспользуемся RTTI (Run-Time Type Information).
Для начала перенесите объявление переменной differentStrings и методов Compare и ShowDifferences в секцию private и добавьте директиву $RTTI, которая даст доступ к приватным методам (к приватным переменным доступ через RTTI разрешён по умолчанию):
Код тестирования поменяйте следующим образом, не забыв добавить в секцию uses юнит System.Rtti:
Аналогично можно тестировать приватные свойства. Директива $RTTI будет выглядеть тогда следующим образом:
Итак, из статьи вы узнали, как реализована поддержка разработки с помощью тестирования в Delphi, а именно: как создавать тестовый проект, как создавать тесты и проводить тестирование, как тестировать приватные методы.
Комментарии
Вам нужно запустить тестовый проект. Вот цитата из статьи: