Тестування та налагодження програм
Тестування та налагодження програм
Тестування виявляє лише наявність, але ніяк не відсутність помилок.
Е. Дейкстра
Програма, вільна від помилок — це абстрактне теоретичне поняття.
Мало в якому виді діяльності існує стільки можливостей для помилок, як у програмуванні. Одним з критеріїв професійної майстерності програмістів є їх спроможність виявляти та виправляти власні помилки. Програмування – це досить складна задача. Ми намагались описати різні технології програмування, мета яких, в першу чергу, зробити програми структурними і зрозумілими. Але жодна з цих технологій не здатна в корені змінити сумного факту – помилки в програмі зустрічаються завжди. Ми знаходимо їх з допомогою тестування, а усуваємо з допомогою налагодження. Починаючі програмісти не вміють цього робити, досвідчені – вміють, але помилки роблять усі без виключень. Як ні важко з цим змиритись, але хороші програмісти знають, що основний час при програмуванні буде витрачений на тестування та налагодження. Нижче ми обговоримо, як можна скоротити час на налагодження програми і як зробити цей процес більш технологічним. Визначимо зміст ключових слів даного розділу.
Налагодження (рос. отладка) – це процес, який починається з моменту встановлення існування помилки і закінчується локалізацією цієї помилки в програмі, тобто визначенням її характеру та місцезнаходження. Таким чином, налагодження програми передбачає обов’язкову наявність помилки.
Тестування – це виконання комплексу вправ (завдань) для перевірки працездатності програми за будь-яких умов. Тестування може виявити факт наявності помилки, а налагодження виявляє причину помилки, так що ці два етапи розробки “перекриваються”.
Налагодження програм.
Налагодження програм – досить складний процес. По-перше, для виправлення помилки необхідно повністю виявити її причини, які часто далеко неочевидні. По-друге, ця діяльність психологічно носить негативний характер, в тому розумінні, що програміст повинен визнати, що саме його помилка є причиною програмного збою. Крім того, налагодження – це процес, який призупиняється лише тимчасово, поки тестування не виявить наявність чергової помилки.
Отже, що робити, коли програма не працює, або працює, але видає неправильні результати? Зі стратегічної точки зору треба мати на увазі, що існують три основні методи налагодження програми, кожен з яких має свої особливості.
Використати при створенні програми всі методи, які дозволили б зменшити кількість помилок в програмі, а у випадку їх виявлення використовувати переважно налагодження вручну, тобто перегляд тексту програми та ретельний його аналіз.
Переважне використання програмних засобів комп’ютера – так званих налагоджувачів (англ. debuggers) для пошуку помилок. Як варіант цього метода можна розглядати трасування, або можливість покрокового виконання програми і слідкування за значеннями змінних в процесі виконання програми, яке є доступним у деяких програмних середовищах. Цей метод не гарантує знаходження всіх помилок, тому що програмний налагоджувач може працювати більш коректно, ніж компілятор – наприклад, обнуляти невизначені змінні або інакше розподіляти пам’ять.
Поєднує створення програми з одночасним налагодженням та тестуванням її частин. Цей метод вимагає високої самодисципліни програміста і є більш ефективним у випадку аналітичного програмування (програмування згори донизу).
Важко сказати, якому підходу слід надавати перевагу. Скоріше за все це визначається характером програми та особистими прихильностями її автора.
Захисне програмування
Отже, помилка – це реальне і неминуче явище в будь-якій програмі. Тому цілком природною виглядає принцип захисного програмування [9]. Захисне програмування – це методологія створення програм, яка зменшує ймовірність помилок в програмі. Основна ідея полягає в тому, щоб передбачити в програмі якомога більше засобів контролю помилок.
Лозунгом захисного програмування може вважатися відомий закон Мерфі:
Все, що може зіпсуватися, псується обов’язково. Все, що не може зіпсуватися, псується також.
Принцип захисного програмування спирається на два основних поняття: захист і стійкість до помилок (в першу чергу невірних даних).
Основні рекомендації цього принципу по захисту програм зводяться до вимоги проектувати і програмувати таким чином, щоб не лише гарантувати очікуване використання програми у строгій відповідності до технічного завдання, а й зробити неможливим її невірне використання. Інакше кажучи, мова йде про таке програмування, коли програмний продукт дуже важко, якщо не взагалі неможливо, використати за межами області дії його технічного завдання.
Найпростіший метод – це тотальний контроль. При цьому програма збільшується в об’ємі порівняно з технічним завданням за рахунок введення додаткових модулів і операторів для перевірки. Контролю в першу чергу підлягають:
вхідні дані (дуже багато програмних помилок пов’язано з невірним зчитуванням вхідних даних за рахунок помилок набору, невірних форматів і т.д. Тому введені дані дуже бажано роздруковувати одразу після їх вводу. Цей процес називається перевіркою відлунням (рос. эхо-проверкой));
всі звертання з інших програм, включаючи “рідні” підпрограми;
проміжні дані, які передаються з інших програм;
записи бази даних;
результати обчислень (своєї ж програми). Тут можливі помилки за рахунок переповнення або втрати точності.
На останньому пункті треба зупинитись більш детально. Відомо, що всі обчислення в програмуванні виконуються наближено. Внаслідок цього може виникати явище, яке називається патологією чисел. Найгірше у цьому те, що такі ситуації неможливо точно змоделювати. Для спрощення наведемо приклади для дійсних чисел, що займають чотири розряди.
Нехай треба обчислити значення змінної b = (1.0/3)*3. З урахуванням обмеженості розрядів це дасть b = 0.3333*3 = 0.9999. Зрозуміло, що у такому випадку перевірка (b = 1) завжди даватиме результат false.
Нехай x = 999.0, y = -1000, z = 0.0001. З урахуванням обмеженості розрядів маємо парадоксальний результат:
((x + y) + z) + 1 = ((-1) + 0.0001) + 1 = 0.0001, але
(x + (y