Юніт-тести delphi або розробка через тестування

Розробка через тестування в Delphi проводиться за допомогою вбудованого інструменту DUnit. У статті ми розглянемо, як створюються тестові проекти Delphi, як створювати юніт тести і як тестувати.

Отже, спочатку поговоримо про те, що таке DUnit. DUnit - це інструмент тестування з відкритими початковими кодами, заснований на JUnit. Доступний він як для Delphi, так і для C ++.

У статті я не буду заглиблюватися в теорію, а лише покажу, як користуватися інструментом DUnit в Delphi. Будемо вважати, що Новомосковсктель знає, що таке розробка через тестування.

Створення тестового проекту

Тестовий проект містить один або кілька тестових випадків, які вдають із себе звичайні .pas файли і будуть доступні в IDE на панелі Project Manager. Також RAD Studio надає в ваше розпорядження майстер створення тестового проекту «Test Project Wizard». Рекомендується створювати два окремих проекти: один тестований, а другий тестує. Так вам не доведеться в майбутньому видаляти ваші тести з готового додатка.

Давайте для початку створимо проект, який ми будемо тестувати. Припустимо, це буде віконне VCL додаток. Виберіть пункт меню «File -> New -> VCL Forms Application - Delphi». Створений проект збережіть.

Після створення тестованого проекту, створимо тестовий проект. Для цього виберіть пункт меню «File -> New -> Other. », Потім в діалозі« New Items »виберіть« Unit Test -> Test Project »і натисніть« OK ».

Юніт-тести delphi або розробка через тестування

На першому кроці майстра «Test Project Wizard» в поле «Source Project» можна вказати тестований проект, якщо їх декілька. У полях «Project Name» і «Location» вказується назва і розташування тестового проекту. В поле «Personality» вибирається мова програмування (в нашому випадку - це Delphi). Всі перераховані поля заповнилися автоматично, що нам підходить. Галочку «Add to project group» залиште, щоб проект додався в поточну групу проектів. Натисніть «Next>».

Юніт-тести delphi або розробка через тестування

На наступному кроці можна вибрати, як буде виконуватися тест (поле «Test Runner»): у вікні ( «GUI») або в консолі ( «Console»). Залишимо тут запропонований за умовчанням варіант - «GUI». В поле «Test Framework» вказуються інструменти тестування. Поміняти в цьому полі нічого не можна, тому що для Delphi і C ++ підтримується тільки інструмент DUnit. Натисніть «Finish» і ви побачите, що в групі проектів з'явився новий порожній тестовий проект.

Юніт-тести delphi або розробка через тестування

Тестові випадки і тестування

У типовому тестовому проекті, для кожного тестованого класу є тестує клас, але це не обов'язково. Тестуючий клас також прив'язаний до тестового випадку. Як правило, тестує клас має набір з одного або декількох методів, які відповідають одному або декільком методам тестованого класу. В один тестовий проект можуть бути включені кілька тестових випадків. Запуск кожного тестового випадку і тестового проекту може бути автоматизований за допомогою bat-файлів або скриптів збірки проекту.

В основному рекомендується створювати тести в окремому проекті (окремо від тестованого проекту). Так вам не потрібно буде видаляти тести з проекту перед фінальною збіркою проекту.

RAD Studio надає вам майстер «Test Case Wizard» для допомоги в створенні тестових випадків, які ви зможете налаштувати на свій розсуд.

Перш ніж зробити тестовий випадок, давайте визначимося, що ми будемо тестувати. В тестованому проект Project1. який ми створили, є форма. Давайте її і будемо тестувати. Припустимо, наша форма буде через підрядник порівнювати два текстові файли і показувати рядки з відмінностями. Порівнювати будемо двома способами: з огляду на регістр і без урахування регістру. Код для тесту зробимо елементарний, будемо порівнювати рядки з однаковими індексами.

Отже, на форму ставимо два текстових поля TRichEdit і дві кнопки TButton. Потім обробляємо події від натискань і дописуємо код наступним чином:

Як бачите, після натискання на кнопки будуть викликатися дві процедури Compare і ShowDifferences. Перша процедура буде порівнювати два тексти і зберігати індекси незбіжних рядків в список differentStrings. а друга процедура буде на основі цього списку підфарбовувати незбіжні рядки в червоний колір. В процедуру Compare буде передаватися параметр ignoreCase визначає спосіб порівняння рядків. Поки реалізацію функції Compare робити не будемо, а відразу зробимо тест для неї.

Для створення тестів потрібно зробити наступні кроки:

Юніт-тести delphi або розробка через тестування

Юніт-тести delphi або розробка через тестування

        • На наступному кроці задається тестовий проект в поле «Test Project», ім'я файлу тестового випадку в поле «File name», інструменти тестування в поле «Test Framework» (це поле неактивно, тому що підтримується тільки DUnit) і базовий клас в поле «Base class». Базовий клас TTestCase підходить для більшості випадків, але ви можете використовувати і власний клас. У нашому прикладі ми не будемо тут нічого міняти. Натисніть кнопку «Finish».

Юніт-тести delphi або розробка через тестування

Після цього ви побачите, що в тестовому проекті з'явився файл «TestUnit1.pas» і в цей же проект доданий тестований юніт «Unit1.pas».

Юніт-тести delphi або розробка через тестування

А ось що ви побачите в файлі TestUnit1.pas:

Як бачите, тут зроблена заготовка для тестирующего класу TestTForm1. успадкованого від класу TTestCase. У секції initialization відбувається реєстрація цього класу.

У методі SetUp відбувається підготовка до тестування. Тут потрібно створити тестований клас і підготувати все що потрібно для тестів, наприклад, з'єднатися з віддаленим сервером або базі даних і т.п. До речі тут код згенерований за помилкою: конструктор форми повинен приймати вхідний параметр. Виправимо рядок коду зі створенням форми наступним чином:

Метод TearDown викликається після закінчення тестування і тут потрібно звільнити всі ресурси і видалити всі створені об'єкти. Тут згенерований код нас влаштовує.

Метод TestCompare створений якраз для тестування нашого методу Compare. Як бачите, тут викликається наш метод Compare. але немає ніяких перевірок. Давайте додамо тут в текстові поля однаковий текст, викличемо метод Compare і зробимо перевірку результату.

Після цього запустіть тестовий проект Project1Tests.exe. Для цього зробіть його активним (двічі клацніть по проекту в віконці «Project Manager») і потім запустіть його виконання (для цього виберіть пункт меню «Run -> Run» або натисніть клавішу F9). Після запуску перед вами з'явиться віконце, показане на картинці нижче.

Юніт-тести delphi або розробка через тестування

Щоб запустити всі тести виберіть пункт меню «Actions -> Run». Якщо у вас багато тестів, а вам потрібно виконати тільки частину з них, ви можете проставити галочки поруч з потрібними тестами і потім викликати пункт меню «Actions -> Run selected test». Після виконання тестів ви побачите нашу помилку. Це нормально, адже поки наша функція Compare не написана і вона нічого не порівнює. Якщо ви натиснете на помилку, то в нижньому полі побачите подробиці.

Юніт-тести delphi або розробка через тестування

Тепер давайте виправляти помилки, щоб тестування пройшло успішно. Допишите функцію порівняння наступним чином:

У методі тестування додамо тести для різних варіантів порівняння:

Тепер протестуємо нашу функцію Compare. Як бачите, все працює правильно, помилок немає.

Юніт-тести delphi або розробка через тестування

Крім методу CheckEquals в вашому розпорядженні є й інші методи для перевірки результатів. Ось основні методи, які вам можуть знадобитися:

        • Check - перевіряє виконання умови і кидає виняток, якщо умова не виконується.
        • CheckEquals - перевіряє рівність двох значень і кидає виняток, якщо значення не рівні.
        • CheckNotEquals - перевіряє нерівність двох значень і кидає виняток, якщо значення рівні.
        • CheckNotNull - перевіряє покажчик на «Не nil» і кидає виняток, якщо покажчик дорівнює nil.
        • CheckNull - перевіряє покажчик на nil і кидає виняток, якщо курсор не дорівнює nil.
        • CheckSame - перевіряє рівність покажчиків на об'єкти і кидає виняток, якщо покажчики не рівні.
        • Fail - просто кидає виняток ETestFailure з потрібним вам текстом.

Тестування приватних методів

Окремо хотілося б показати, як тестувати приватні методи. Для виклику приватних методів в Delphi ми скористаємося RTTI (Run-Time Type Information).

Код тестування поміняйте наступним чином, не забувши додати в секцію uses юніт System.Rtti:

Аналогічно можна тестувати приватні властивості. Директива $ RTTI буде виглядати тоді наступним чином:

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