
Практична робота № 3
Тема: Тестування програм методами «чорного ящика»
Мета: проаналізувати методи тестування програмних продуктів, оцінити різні методи з погляду детектування і покриваючої здатності тестів. Отримати практичні навички формування тестових наборів та побудови таблиць істинності.
Теоретичний розділ:
1 Тестування за принципом «чорного ящика»
Одним із способів перевірки програм є стратегія тестування, звана стратегією "чорного ящика" або тестуванням з управлінням даними. В цьому випадку програма розглядається як "чорний ящик" і таке тестування має на меті з'ясування обставин, в яких поведінка програми не відповідає специфікації (заявленим вимогам).
Для виявлення всіх помилок в програмі необхідно виконати вичерпне тестування, тобто тестування на всіх можливих наборах даних. Для тих же програм, де виконання команди залежить від попередніх подій, необхідно перевірити і всі можливі наслідки.
Очевидно, що побудова вичерпного вхідного тесту для більшості випадків неможлива. Тому, звичайно виконується "розумне" тестування, при якому тестування програми обмежується прогонами на невеликій підмножині всіх можливих вхідних даних. Природно при цьому доцільно вибрати саме відповідну підмножину (підмножина з щонайвищою вірогідністю виявлення помилок).
Правильно вибраний тест підмножини повинен володіти наступними властивостями:
-
зменшувати, причому більш ніж на одиницю число інших тестів, які повинні бути розроблені для досягнення наперед відомої мети «припустимого» тестування;
-
покривати значну частину інших можливих тестів, що в деякій мірі свідчить про наявність або відсутність помилок до і після вживання цієї обмеженої безлічі значень вхідних даних.
Стратегія "чорного ящика" включає наступні методи формування тестових наборів:
-
еквівалентне розбиття;
-
аналіз граничних значень;
-
аналіз причинно-наслідкових зв'язків;
-
припущення про помилку.
1.1. Еквівалентне розбиття
Початкові дані програми необхідно розбити на кінцеве число класів еквівалентності, так щоб можна було припустити, що кожний тест, що є представником деякого класу, еквівалентний будь-якому іншому тесту цього класу. Іншими словами, якщо тест якого-небудь класу знаходить помилку, то передбачається, що всі інші тести цього класу еквівалентності теж знайдуть цю помилку і навпаки
Кожний тест повинен включати по можливості максимальну кількість різних вхідних умов, що дозволяє мінімізувати загальне число необхідних тестів.
Перше положення використовується для розробки набору "цікавих" умов, які маєть бути протестовані, а друге - для розробки мінімального набору тестів.
Розробка тестів методом еквівалентного розбиття здійснюється в два етапи:
-
виділення класів еквівалентності;
-
побудова тестів.
Виділення класів еквівалентності
Класи еквівалентності виділяються шляхом вибору кожної вхідної умови (зазвичай це речення або фраза із специфікації) і розбиттям її на дві або більше груп. Для цього використовується таблиця наступного вигляду:
Вхідна умова |
Правильні класи еквівалентності |
Неправильні класи еквівалентності |
|
|
|
Правильні класи включають правильні (припустимі) дані, неправильні класи – неправильні (неприпустимі) дані.
Виділення класів еквівалентності є евристичним процесом, проте при цьому існує ряд правил:
-
Якщо вхідні умови описують область значень (наприклад «цілі дані можути приймати значення від 1 до 999»), то виділяють один правильний клас 1X999 і два неправильних X<1 і X>999.
-
Якщо вхідна умова описує число значень (наприклад, «в автомобілі можуть їхати від одного до шести чоловік»), то визначається один правильний клас еквівалентності і два неправильних (жодної людини і більше шести чоловік).
-
Якщо вхідна умова описує безліч вхідних значень і є підстави вважати, що кожне значення програміст трактує окремо (наприклад, «відомі способи пересування на АВТОБУСІ, ГРУЗОВИКУ, ТАКСІ, МОТОЦИКЛІ або ПІШКИ»), то визначається правильний клас еквівалентності для кожного значення і один неправильний клас (наприклад «на ПРИЧЕПІ»).
-
Якщо вхідна умова описує ситуацію «повинно бути» (наприклад, «першим символом ідентифікатора має бути буква»), то визначається один правильний клас еквівалентності (перший символ - буква) і один неправильний (перший символ - не буква).
-
Якщо є будь-яка підстава вважати, що різні елементи класу еквівалентності трактують програму неоднаково, то даний клас розбивається на менші класи еквівалентності.
Побудова тестів
Цей крок полягає у використанні класів еквівалентності для побудови тестів. Цей процес включає:
Призначення кожному класу еквівалентності унікального номера.
-
Проектування нових тестів, кожний з яких покриває якомога більше число непокритих класів еквівалентності, до тих пір, поки всі правильні класи не будуть покриті (тільки не загальними) тестами.
-
Запис тестів, кожний з яких покриває один і лише один з непокритих неправильних класів еквівалентності, до тих пір, поки всі неправильні класи не будуть покриті тестами.
-
Розробка індивідуальних тестів для неправильних класів еквівалентності обумовлено тим, що певні перевірки з помилковими входами приховують або замінюють інші перевірки з помилковими входами.
Недоліком методу є те, що він не досліджує комбінації вхідних умов.