Створення тестування автоматизованого блоку


11

Які стратегії можна використати для автоматизації створення одиничних тестових справ? Які аспекти вам потрібно розглянути в кожному класі, щоб мати можливість створити принаймні гідний каркас тестового випадку?

Я розумію, що комплексне автоматичне рішення не є практичним, але я хотів би трохи прискорити створення тесту, хоча б створивши скелет. Я не шукаю прикладів коду, просто, можливо, кілька пропозицій з того, з чого почати, або прикладів, де щось подібне було зроблено, щоб я міг бачити, як вони підійшли до цього і що можливо.

Мене особливо цікавлять методи створення одиничних тестових скелетів у PHP, які не містять усіх інструментів, які надають інші мови, наприклад, повного натяку на тип , наприклад.


Найновіша Visual Studio - це все, що вам потрібно ...
Робота

Відповіді:


5

Ваша стратегія та скелет нетривіально залежать від того, які типи тестів ви бажаєте створити, яке покриття ви шукаєте та мову / середовище, в якому працюєте.

Досить прямо вперед написати тестовий генератор, який для таких мов, як C або Java, зчитує підписи класів і автоматично генерує тести для стандартних кутових випадків (передаючи 0, 2 випадкових значення, MAX_INT, MIN_INT, на цілий аргумент, нулі для нульових значень тощо). Потім можна запустити згенеровані тести, записати результати для кожного тесту та вручну фільтрувати їх, щоб видалити невідповідні, затвердити прийнятні результати для тестів, які проходять (щоб вони потім могли автоматично проходити далі) та позначити як недійсні, які не вдалися .

Ви можете доповнити це додаванням тегів / коментування / рефакторингу класів, щоб допомогти вашому генератору з додатковими підказками. Можливо, у вас є тег, який перераховує всі можливі винятки, з яких дозволено викликати виклик методу, або який дає зменшений діапазон дійсних цілих чисел для цілого аргументу. Подивіться на це як на короткий хід, щоб самостійно писати тести.

Отже, ось деякі компоненти, які ви хочете переглянути:

  • Компонент для автоматичного розбору вихідних кодів / підписів функцій / ручних анотацій, створення стандартних тестових випадків або контур / підписів для тестових випадків, які чекають завершення вашого вводу.
  • Постійно зростаюча / мінлива мова тегів / анотацій / коментарів, яка може переходити на будь-який рівень деталізації (метод / клас / підпис / під час циклів / тощо), що представляє підказки автоматизованому конструктору тестів. В ідеалі ви повинні мати можливість грати з цією мовою, не перекодуючи свій фреймворк або будь-які шматки в ньому
  • Автоматизований тест-бігун, з можливістю ідентифікувати нові / старі тести та записувати / тестувати проти "прийнятних" відповідей для кожного тесту. В ідеалі цей бігун створить базу даних пробних пробігів, прийнятих / відхилених результатів та поточних прийнятних результатів для кожного тесту.
  • Автоматизований "обробник об'єктів", який, даючи ім'я класу та карту імен-> значень, може генерувати об'єкт, що імітує клас, повертаючи настроювані дані для викликів функцій, аксесуарів, відкритих слотів даних тощо ...

Існує безліч тестових рамок, які вже містять фрагменти цієї функціональності для різних мов та платформ. Незважаючи на те, що почати робити цю роботу досить просто і органічно вирощувати подібну структуру в органічному режимі, це також нескінченний довгостроковий проект, який, ймовірно, буде дублювати існуючі роботи. Я рекомендую витратити багато часу, щоб переглянути спочатку доступні, а потім вирішити, чи варто того часу зануритися.


5

У мене ще не було можливості використовувати його в застосуванні значного розміру чи складності, але є інструменти, включаючи CodePro AnalytiX від Google , які автоматизують генерацію одиничних тестів для додатків Java . Я також знайшов комерційний продукт, тест C ++ Parasoft , який, можливо, дозволяє створити тести на C ++

Ці програми використовували евристику для створення тестових випадків. Я не впевнений, що існує єдина рамка, яку ви можете використовувати для створення скелета, але є конструкції, які ви можете шукати. Я схильний зосереджуватися на циклі, умовних операторах ( ifблоки, switch/ caseзаяви) та винятках, і створюю тестові випадки, які змушують виконувати різні шляхи виконання.

Я б не зосереджувався на пришвидшенні написання тестів, намагаючись створити скелет або шаблон, а скоріше вдосконалюючи аналіз специфікації та / або впровадження та написання високоякісних тестів. Бути в змозі визначити, які тести додають найбільшу цінність на початку, їх написання, а потім заповнення дірок пізніше матиме більший вплив на продуктивність та якість.


Тільки для надання більшої реклами, Falcon випробував CodePro над проектом і написав трохи розмиття щодо свого досвіду .


Google CodePro Analytix звучить цікаво. Але "Quis зберігач ipsos зберігає?" Хто тестує тести? Це може бути використано лише для резервного копіювання існуючого проекту за допомогою тестування одиниць і, ймовірно, не виявить збоїв, скоріше буде вважати, що дефекти є правильними.
Сокіл

@Falcon Ви не можете сліпо довіряти жодному інструменту - це просто спричинить більше головних болів. Я думаю, що тут стосується підказки прагматичного програміста "дбати про своє ремесло". CodePro містить тестовий редактор, щоб зробити його тривіальним, щоб побачити, які значення передаються та який очікуваний результат, а потім внести зміни до нього (а потім оновити згенерований код тесту, щоб відобразити ці зміни).
Томас Оуенс

Мені просто цікаво, що в цьому випадку надійніше людина чи машина. Я думаю, що ці генеровані тести викличуть більше головних болів, ніж тести, написані вручну. В ідеалі тест слід все-таки написати спочатку. Але я обов'язково спробую. Я хотів би побачити інструмент, який може генерувати тести на основі формальних вимог та деяких метаданих клею для інтерфейсу системи одного дня.
Сокіл

@Falcon Так, в ідеалі деякі тести повинні бути складені спочатку, але, поки ви не реалізуєте і не зможете виконати тестування білого поля, ви не обов'язково бачите всі різні крайові випадки, які ви можете побачити, як тільки у вас є реалізація. Якщо ви отримаєте шанс пограти з тестовими поколіннями CodePro, ви могли б десь розмістити свої думки і якось отримати мені посилання? Мені цікаво подивитися, наскільки добре це працює, та досвід інших людей з цим.
Томас Оуенс

Я перевіряю його на наступному тижні за допомогою додатку J2EE середнього розміру (120 клоків), який містить деякі дійсно жорсткі правила бізнесу та розповім про мій досвід тут.
Сокіл

1

Я написав генератор для прискорення тестування одиниць для проекту .NET кілька років тому. Була велика база коду без тестових одиниць, і вона мала на меті швидке збільшення базового покриття. Ось кілька записок, які можуть бути корисними:

  • Моя ймовірність полягала в тому, що основна основа, над якою розроблявся проект, забезпечувала стандартні операції та імена класів. Якщо ви думаєте написати власну, стандартна структура на зразок цієї допоможе дуже.
  • Використання дуже data-driven testingдопомагає, якщо це дозволяє ваша база коду. Тестовий фреймворк створив таблицю бази даних для кожного тесту одиниць для зберігання тестових даних, так що кожен рядок у цій таблиці був окремим тестом і не потрібен додатковий код ( Правило представлення ). З цього моменту фактичні тести можна легко створити автоматично або ввести вручну.
  • Отримані одиничні тести були простими, але вони smoke testпринаймні служили s. Для областей підвищеного ризику були написані додаткові тести вручну.

Підводячи підсумок, я погоджуюся, що загальне рішення було б недоцільним (якщо це можливо). Я вважаю, що шанси краще, якщо база даних підходить для генерації тесту, і тестова рамка може скористатися її структурою.

(В якості побічної ноти, є Pex , але це для .NET)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.