Материал: Практична робота №3

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Практична робота № 3

Тема: Тестування програм методами «чорного ящика»

Мета: проаналізувати методи тестування програмних продуктів, оцінити різні методи з погляду детектування і покриваючої здатності тестів. Отримати практичні навички формування тестових наборів та побудови таблиць істинності.

Теоретичний розділ:

1 Тестування за принципом «чорного ящика»

Одним із способів перевірки програм є стратегія тестування, звана стратегією "чорного ящика" або тестуванням з управлінням даними. В цьому випадку програма розглядається як "чорний ящик" і таке тестування має на меті з'ясування обставин, в яких поведінка програми не відповідає специфікації (заявленим вимогам).

Для виявлення всіх помилок в програмі необхідно виконати вичерпне тестування, тобто тестування на всіх можливих наборах даних. Для тих же програм, де виконання команди залежить від попередніх подій, необхідно перевірити і всі можливі наслідки.

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

Правильно вибраний тест підмножини повинен володіти наступними властивостями:

  • зменшувати, причому більш ніж на одиницю число інших тестів, які повинні бути розроблені для досягнення наперед відомої мети «припустимого» тестування;

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

Стратегія "чорного ящика" включає наступні методи формування тестових наборів:

  • еквівалентне розбиття;

  • аналіз граничних значень;

  • аналіз причинно-наслідкових зв'язків;

  • припущення про помилку.

1.1. Еквівалентне розбиття

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

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

Перше положення використовується для розробки набору "цікавих" умов, які маєть бути протестовані, а друге - для розробки мінімального набору тестів.

Розробка тестів методом еквівалентного розбиття здійснюється в два етапи:

  • виділення класів еквівалентності;

  • побудова тестів.

Виділення класів еквівалентності

Класи еквівалентності виділяються шляхом вибору кожної вхідної умови (зазвичай це речення або фраза із специфікації) і розбиттям її на дві або більше груп. Для цього використовується таблиця наступного вигляду:

Вхідна умова

Правильні класи еквівалентності

Неправильні класи еквівалентності

Правильні класи включають правильні (припустимі) дані, неправильні класи – неправильні (неприпустимі) дані.

Виділення класів еквівалентності є евристичним процесом, проте при цьому існує ряд правил:

  • Якщо вхідні умови описують область значень (наприклад «цілі дані можути приймати значення від 1 до 999»), то виділяють один правильний клас 1X999 і два неправильних X<1 і X>999.

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

  • Якщо вхідна умова описує безліч вхідних значень і є підстави вважати, що кожне значення програміст трактує окремо (наприклад, «відомі способи пересування на АВТОБУСІ, ГРУЗОВИКУ, ТАКСІ, МОТОЦИКЛІ або ПІШКИ»), то визначається правильний клас еквівалентності для кожного значення і один неправильний клас (наприклад «на ПРИЧЕПІ»).

  • Якщо вхідна умова описує ситуацію «повинно бути» (наприклад, «першим символом ідентифікатора має бути буква»), то визначається один правильний клас еквівалентності (перший символ - буква) і один неправильний (перший символ - не буква).

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

Побудова тестів

Цей крок полягає у використанні класів еквівалентності для побудови тестів. Цей процес включає:

Призначення кожному класу еквівалентності унікального номера.

  • Проектування нових тестів, кожний з яких покриває якомога більше число непокритих класів еквівалентності, до тих пір, поки всі правильні класи не будуть покриті (тільки не загальними) тестами.

  • Запис тестів, кожний з яких покриває один і лише один з непокритих неправильних класів еквівалентності, до тих пір, поки всі неправильні класи не будуть покриті тестами.

  • Розробка індивідуальних тестів для неправильних класів еквівалентності обумовлено тим, що певні перевірки з помилковими входами приховують або замінюють інші перевірки з помилковими входами.

Недоліком методу є те, що він не досліджує комбінації вхідних умов.

1.2 Аналіз граничних значень.

Граничні умови - це ситуації, що виникають, вище або нижче межі вхідних даних класів еквівалентності. Аналіз граничних значень відрізняється від еквівалентного розбиття наступним:

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

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

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

  • Побудувати тести для меж області і тести з неправильними вхідними даними для ситуацій незначного виходу за межі області, якщо вхідна умова описує область значень (наприклад, для області вхідних значень від -1.0 до +1.0 необхідно написати тести для ситуацій -1.0, +1.0, -1.001 і +1.001).

  • Побудувати тести для мінімального і максимального значень умов і тести, великі і менші цих двох значень, якщо вхідна умова задовольняє дискретному ряду значень. Наприклад, якщо вхідний файл може містити від 1 до 255 записів, то перевірити 0, 1, 255 і 256 записів.

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

  • Використовувати друге правило для кожної вихідної умови.

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

  • Спробувати свої сили в пошуку інших граничних умов.

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

1.3 Аналіз причинно-наслідкових зв'язків.

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

Для використання методу необхідне розуміння булевої логіки (логічних операторів - і, або, не). Побудова тестів здійснюється у декілька етапів.

  • Специфікація розбивається на «робочі» ділянки, оскільки таблиці причинно-наслідкових зв'язків стають громіздкими при застосуванні методу до великих специфікацій. Наприклад, при тестуванні компілятора як робочу ділянку можна розглядати окремий оператор мови.

  • В специфікації визначаються безліч причин і безліч наслідків. Причина є окрема вхідна умова або клас еквівалентності вхідних умов. Наслідок є вихідна умова або перетворення системи. Кожній причині і слідству приписується окремий номер.

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

Примітка. При цьому можна використовувати наступні прийоми:

По можливості виділяти незалежні групи причинно-наслідкових зв'язків в окремі таблиці.

Істина позначається "1". Брехня позначається "0". Для позначення неважливих станів умов застосовувати позначення "Х", яке припускає довільне значення умови (0 або 1).

  • Кожний рядок таблиці істинності перетвориться в тест.

Недолік методу - неадекватно досліджує граничні умови.

1.4 Припущення про помилку.

Часто програміст з великим досвідом вишукує помилки "без жодних методів". При цьому він підсвідомо використовує метод "припущення про помилку". Процедура методу припущення про помилку в значній мірі заснована на інтуїції. Основна ідея методу полягає в тому, щоб перерахувати в деякому списку можливі помилки або ситуації, в яких вони можуть з'явитися, а потім на основі цього списку скласти тести. Іншими словами, вимагається перерахувати ті спеціальні випадки, які можуть не бути враховані при проектуванні.

2 Приклад вживання методів тестування «чорним ящиком»

Нехай необхідно виконати тестування програми, що визначає точку перетину двох прямих на площині. Попутно, вона повинна визначати паралельність прямої однієї їх осей координат.

В основі програми лежить рішення системи лінійних рівнянь:

Ax + By = C і Dx + Ey = F.

2.1. Використовуючи метод еквівалентного розбиття, одержуємо для всіх коефіцієнтів один правильний клас еквівалентності (коефіцієнт - дійсне число) і один неправильний (коефіцієнт - не дійсне число). Звідки можна запропонувати 7 тестів:

1) всі коефіцієнти - дійсні числа;

2)- 7) по черзі кожний з коефіцієнтів - не дійсне число.

2.2. По методу граничних умов:

  • можна вважати, що для початкових даних граничні умови відсутні (коефіцієнти - "будь-які" дійсні числа);

  • для результатів - одержуємо, що можливі варіанти: єдине рішення, прямі зливаються (безліч рішень), прямі паралелі (відсутність рішень). Отже, можна запропонувати тести, з результатами усередині області:

      • результат - єдине рішення (  0);

      • результат - безліч рішень ( = 0 і x=y=0);

      • результат - відсутність рішень ( = 0, але x0 або у0);

      • і з результатами на границі:

      •  = 0,01;

      •  = -0,01;

      •  = 0 x = 0,01 у = 0;

      •  = 0 у = -0,01 x = 0.

2.3. По методу аналізу причинно-наслідкових зв'язків:

Визначаємо безліч умов.

а) для визначення типу прямої:

- для визначення типа і існування першої прямої;

- для визначення типа і існування другої прямої;

б) для визначення точки перетину:

 = 0

x = 0

у = 0

Виділяємо три групи причинно-наслідкових зв'язків (визначення типу і існування першої лінії, визначення типу і існування другої лінії, визначення точки перетину) і будуємо таблиці істинності.

A=0

B=0

C=0

Результат

0

0

X

пряма загального положення

0

1

0

пряма, паралельна осі ОХ

0

1

1

вісь ОХ

1

0

0

пряма, паралельна осі ОУ

1

0

1

вісь ОУ

1

1

Х

безліч точок площини

Источник: https://studfile.net/preview/14533254/