THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму

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

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

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

    передбачувані результати повинні бути відомі до тестування;

    слід уникати тестування програми автором;

    необхідно досконально вивчати результати кожного тесту;

    необхідно перевіряти дії програми на невірних даних;

    необхідно перевіряти програму на несподівані побічні ефекти на невірних даних.

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

Існують два принципово різні підходи до формування тестових наборів: структурний і функціональний. структурний підхід базується на тому, що відома структура тестованого ПО, в тому числі його алгоритми ( « скляний ящик»). Тести будуються для перевірки правильності реалізації заданої логіки в коді програми. функціональнийпідхід грунтується на тому, що структура ПО не відома ( « чорний ящик»). В цьому випадку тести будують, спираючись на функціональні специфікації. Цей підхід називають також підходом, керованим даними, так як при його використанні тести будують на базі різних способів декомпозиції безлічі даних. Набори тестів, отримані відповідно до методами цих підходів, об'єднують, забезпечуючи всебічне тестування ПО.

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

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

Іншим способом перевірки програм є функціональне тестування: Програма розглядається як « чорний ящик», Метою тестування є з'ясування обставин, коли поведінка програми не відповідає специфікації. Для виявлення всіх помилок необхідно виконати вичерпнетестування (при всіх можливих наборах даних), що для більшості випадків неможливо. Тому зазвичай виконують « розумне»Або« прийнятне»Тестування, обмежується прогонами програми на невеликому підмножині всіх можливих вхідних даних. При функціональному тестуванні розрізняють наступні методи формування тестових наборів: еквівалентну розбиття; аналіз граничних значень; аналіз причинно-наслідкових зв'язків; припущення про помилку.

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

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

налагодження - це процес локалізації (Визначення оператора програми, виконання якого викликало порушення обчислювального процесу) і виправлення помилок, виявлених при тестуванні ПО. Для виправлення помилки необхідно визначити її причину. Налагодження вимагає від програміста глибоких знань специфіки управління використовуваними технічними засобами, операційної системи, середовища та мови програмування, що реалізуються процесів, природи і специфіки помилок, методик налагодження і відповідних програмних засобів; психологічно дискомфортна (потрібно шукати власні помилки в умовах обмеженого часу); залишає можливість взаємовпливу помилок в різних частинах програми. Чітко сформульовані методики налагодження відсутні. розрізняють:

    синтаксичні помилки- супроводжуються коментарем із зазначенням їх місцеположення, фіксуються компілятором (транслятором) при виконанні синтаксичного і частково семантичного аналізу;

    помилки компоновки- виявляються компоновщиком (редактором зв'язків) при об'єднанні модулів програми;

    помилки виконання -виявляються апаратними засобами, операційною системою або користувачем при виконанні програми, проявляються різними способами і в свою чергу діляться на групи:

    помилки визначення вихідних даних (помилки передачі, помилки перетворення, помилки перезапису і помилки даних);

    логічні помилки проектування (непридатний метод, невірний алгоритм, невірна структура даних, інші) та кодування (помилки некоректного використання змінних, Обчислень, межмодульного інтерфейсу, реалізації алгоритму, інші);

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

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

      ручного тестування (При виявленні помилки потрібно виконати тестируемую програму вручну, використовуючи тестовий набір, при роботі з яким була виявлена \u200b\u200bпомилка);

      індукції(Заснований на ретельному аналізі симптомів помилки, які можуть проявлятися як невірні результати обчислень або як повідомлення про помилку);

      дедукції (Спочатку формують безліч причин, які могли б викликати дане прояв помилки, а потім аналізуючи причини, виключають ті, які суперечать наявним даними);

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

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

Загальна методика налагодження програмних продуктів, написаних для виконання в операційних системах MS DOS і Win32:

1 етап- вивчення прояву помилки;

2 етап -визначення локалізації помилки;

3 етап- визначення причини помилки;

4 етап -виправлення помилки;

5 етап -повторне тестування.

Процес налагодження можна істотно спростити, якщо слідувати основним рекомендаціям структурного підходу до програмування:

    програму нарощувати «зверху-вниз», від інтерфейсу до обробляють підпрограм, тестуючи її по ходу додавання підпрограм;

    виводити користувачеві вводяться ним дані для контролю і перевіряти їх на допустимість відразу після введення;

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

Додаткову інформацію по темі можна отримати в.

Мета роботи:

Здійснити тестування і налагодження розробленої раніше конкретної програми на алгоритмічній мові високого рівня.

Порядок виконання роботи і звітність.

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

Складений набір тестів необхідно представити в звіті.

Теоретичні відомості.

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

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

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

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

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

Комплект тестів повинен бути таким:

Щоб перевірити всі варіанти зовнішнього ефекту програми і варіанти її внутрішньої роботи алгоритму;

Щоб всі гілки алгоритму були пройдені, по крайней мере, по одному разу.

Щоб проконтролювати граничні і вироджені випадки.

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

Процес тестування програми можна розділити на три етапи:

1. Перевірка в нормальних умовах.

2. Перевірка в екстремальних умовах.

3. Перевірка у виняткових ситуаціях.

Кожен з цих трьох етапів перевірки повинен гарантувати отримання вірних результатів при правильних вхідних даних і видачу повідомлень про помилки при неправильних вхідних даних.

Перевірка в нормальних умовах

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

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

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

Перевірка у виняткових ситуаціях.

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

Приклад тестів.

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

сторони

параллепіпед

Примітка

Хороший нормальний тест d 1,7320508

Поняття «налагодження», «налагодження програми». Процес налагодження. Види (методика) отладок, прийоми налагодження.

Після того як процес проектування форми завершений і програмний код написаний, необхідно відкомпілювати програму. В процесі компіляції слід виправити не тільки помилки, але і зауваження. Більшість помилок мають синтаксичний характер. Часто повідомлення про таку помилку виникають ще на стадії написання програмного коду. Якщо роботу не виправлена \u200b\u200bкористувачем, то текст оператора буде виділено червоним кольором. Якщо помилки при компіляції виправлені, то при запуску програми зовсім необов'язково, що не виникне нових помилок. Це можуть бути логічні помилки. Можуть з'явитися помилки при певних даних: розподіл на 0, переповнення, витяг квадратного кореня з негативного числа, відсутність ініціалізації на початку обчислень, відкриття неіснуючого файлу та ін.
При появі виняткових ситуацій на етапі виконання програм компілятор повідомляє про це користувачеві в діалоговому вікні.
При перериванні роботи програми рядок буде відзначена жовтим кольором, якщо діалогове вікно буде закрито при натисканні кнопки Debug - Налагодження. Якщо повідомлення про помилку було закрито кнопкою End - Закінчити, то буде відзначений заголовок процедури, в якій знайдена помилка.

налагодження програми

Налагодження, як ми вже говорили, буває двох видів:

· Синтаксична налагодження. Синтаксичні помилки виявляє компілятор, тому виправляти їх досить легко.

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

налагодження - це процес локалізації та виправлення помилок в програмі.

принципи налагодження

Принципи локалізації помилок:

· Більшість помилок виявляється взагалі без запуску програми - просто уважним просматриванием тексту.

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

· Надзвичайно зручні допоміжні засоби - це налагодження механізми середовища розробки: трасування, проміжний контроль значень. Можна використовувати навіть дамп пам'яті, але такі радикальні дії потрібні вкрай рідко.

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

Принципи виправлення помилок ще більше схожі на закони Мерфі:

· Там, де знайдена одна помилка, можливо, є й інші.

· Можливість, що помилка знайдена правильно, ніколи не дорівнює ста відсоткам.

· Наше завдання - знайти саму помилку, а не її симптом.

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

· Виправляючи одну помилку, дуже легко внести в програму ще парочку. "Наведені" помилки - справжній бич налагодження.

· Виправлення помилок часто змушує нас повертатися на етап складання програми. Це неприємно, але часом неминуче.

Методи налагодження.

1.Сіловие методи

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

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

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

З точки зору "правильного" програмування силові методи погані тим, що не заохочують аналіз завдання.

Підсумовуючи властивості силових методів, отримуємо практичні поради:

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

o використовувати отладочную друк в невеликих кількості і "у справі";

o залишити дамп пам'яті на самий крайній випадок.

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

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

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

5.Методи тестування.

· Метод індукції.
Індукція - це аналіз від приватного до цілого. Переглядаючи симптоми помилки, встановлені одним або декількома тестами і взаємозв'язку між ними, можна виявити причину помилки.

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

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

Автоматизовані засоби налагодження програм.

Стандартні можливості відладчика. Контроль правильності написаної програми (етапи).

засоби налагодження

Крім методик, добре б мати уявлення про засоби, які допомагають нам виявляти помилки. це:

1) Аварійна друк - виведення повідомлень про ненормальний завершення окремих блоків і всієї програми в цілому.

2) Друк в вузлах програми - висновок проміжних значень параметрів в місцях, обраних програмістом. Зазвичай, це критичні ділянки алгоритму (наприклад, значення, від якого залежить подальший хід виконання) або складові частини складних формул (окремо прорахувати і вивести чисельник і знаменник великий дробу).

3) Безпосереднє спостереження:

· Арифметичне (за тим, чому дорівнюють, коли і як змінюються вибрані змінні),

· Логічне (коли і як виконати вибрану послідовність операторів),

· Контроль виходу індексів за допустимі межі,

· Відстеження звернень до змінних,

· Відстеження звернень до підпрограм,

· Перевірка значень індексів елементів масивів і т.д.

Нинішні середовища розробки часто пропонують нам реагувати на виникає проблему в діалоговому режимі. При цьому можна:

· Переглянути поточні значення змінних, стан пам'яті, ділянку алгоритму, де стався збій;

· Перервати виконання програми;

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

Автономне тестування модуля доцільно здійснювати в чотири послідовно виконуваних кроку.

Крок 1. На підставі специфікації отлаживаемого модуля підготуйте тести для кожної можливості і кожної ситуації, для кожного кордону областей допустимих значень всіх вхідних даних, для кожної області зміни даних, для кожної області неприпустимих значень всіх вхідних даних і кожного неприпустимого умови.

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

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

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

Поради отладчику

1) Перевіряйте ретельніше: помилка швидше за все знаходиться не в тому місці, в якому здається.

2) Часто виявляється легше виділити ті місця програми, помилок в яких немає, а потім вже шукати в інших.

3) Ретельніше стежити за оголошеннями констант, типів і змінних, вхідними даними.

4) При послідовної розробки доводиться особливо акуратно писати драйвери і заглушки - вони самі можуть бути джерелом помилок.

5) Аналізувати код, починаючи з самих простих варіантів. Найчастіше зустрічаються помилки:

· Значення вхідних аргументів приймаються не в тому порядку,

· Змінна не проініціалізувати,

· При повторному проходженні модуля, змін ная повторно не ініціалізується,

· Замість передбачуваного повного копіювання структури даних, копіюється тільки верхній рівень (Наприклад, замість створення нової динамічної змінної і присвоювання їй потрібного значення, адреса тупо копіюється з уже існуючою текстовою змінною),

· Дужки в складному вираженні розставлені неправильно.

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

7) Помилка, швидше за все виявиться вашої і буде перебувати в тексті програми. Набагато рідше вона виявляється:

· В компіляторі,

· Операційній системі,

· Апаратної частини,

· Електропроводці в будівлі і т.д.

Але якщо ви абсолютно впевнені, що в програмі помилок немає, перегляньте стандартні модулі, до яких вона звертається, з'ясуйте, чи не змінювалася чи версія середовища розробки, в кінці кінців, просто увійдіть або комп'ютер - деякі проблеми (особливо в DOS-середовищах, що запускаються з- під Windows) виникають через некоректну роботу з пам'яттю.

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

9) Нав'язливий пошук однієї помилки майже завжди непродуктивний. Не виходить - відкладіть завдання, візьміться за написання наступного модуля, на худий кінець займіться документуванням.

10) Намагайтеся не шкодувати часу, щоб з'ясування причину помилки. Це допоможе вам:

· Виправити програму,

· Виявити інші помилки того ж типу,

· Не робити їх в подальшому.

11) Якщо ви вже знаєте симптоми помилки, іноді корисно не виправляти її відразу, а на тлі відомого поведінки програми пошукати інші ляпи.

12) Найбільш труднообнаружіваемие помилки - наведені, тобто ті, що були внесені в код при виправленні інших.

оверко називається перевірка результатів тестування самої тестируемой програмою

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

Мистецтво тестера полягає в тому, щоб створити по можливості повну систему тестів, яка перевіряє всі можливі галузі обчислень. Пояснимо це на найпростішому прикладі. Нехай програма знаходить суму перших N елементів масиву X, що містить M елементів. Крім "нормального" тесту, який перевіряє ситуацію, в якій 1 M. Але це простий випадок, а цикли зазвичай вкладені, і всередині них виробляється розбір випадків, всередині яких свої цикли.

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

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

засоби налагодження

Частина помилок програми ловиться автоматично ще на етапі компіляції. Сюди відносяться всі синтаксичні помилки, помилки невідповідності типів і деякі інші. Однак синтаксично коректна програма потребує налагодженні, оскільки, хоча результати обчислень і отримані, але вони не відповідають необхідним специфікаціям. Найчастіше, ще не налагоджена програма на одних вихідних даних працює правильно, на інших - дає помилковий результат. Мистецтво налагодження полягає в тому, щоб виявити всі ситуації, в яких робота програми призводить до помилкових обчислень. VBA має досить витонченими засобами, призначеними для налагодження програм, тобто для виявлення помилок в програмах (тестування) та їх виправлення. Є дві групи засобів VBA, що допомагають програмісту виявити і виправити помилки:

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

Перш, ніж приступити до докладного розгляду цих коштів, нагадаємо, що в ході налагодження програма може знаходитися в одному з трьох станів: проектування, обчислення і переривання. Закінчивши проектування, можна запустити програму на виконання. Перервавши виконання програми в заданій точці, перейшовши в стан переривання, можна проконтролювати значення змінних і властивостей об'єктів в даній точці і, якщо потрібно, змінити ці значення "вручну". При цьому можна змінити порядок виконуваних операторів, ставити наступне виконуваний оператор, можна редагувати програмний текст перед продовженням обчислення. Перехід зі стану обчислення в стан переривання може відбуватися з різних причин, наприклад, після досягнення точки переривання, при виконанні одного з численних умов переривання, через покрокового виконання програми. Всі ці можливості ми ще обговоримо, а зараз розглянемо один особливий випадок. Іноді програма "зациклюється" і необхідно примусово перевести її в с остояніе переривання. Як зупинити працюючу програму? Просто натисніть знайому ще по роботі в DOS пару клавіш Ctrl + Break. На екрані з'явиться наступне діалогове вікно з повідомленням про зупинку.

налагодження (Debug, debugging) - етап розробки комп'ютерної програми, на якому виявляють, локалізують і усувають помилки. Щоб зрозуміти, де виникла помилка, доводиться: дізнаватися поточні значення змінних; з'ясовувати, яким шляхом виконувалася програма.

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

Технології налагодження.

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

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

Інструменти налагодження.

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

2. профілювальники- дозволяють визначити скільки часу виконується ту чи іншу ділянку коду, а аналіз покриття дозволить виявити невиконувані ділянки коду.

3. API логгер- дозволяють програмісту відстежити взаємодію програми і Windows API за допомогою запису повідомлень Windows в лог.

4. дизасемблеридозволять програмісту подивитися асемблерний код виконуваного файлу

5. сніферидопоможуть програмісту простежити мережевий трафік генерується програмою

6. Сніфери апаратних інтерфейсівдозволять побачити дані якими обмінюється система і пристрій.

7. Список системи.

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

Налагодження \u003d Тестування + Пошук помилок + Редагування

види налагодженняПО, включаючи тестування (в нашій країні).

1.1. Автономна налагодження. Послідовне роздільне тестування різних частин програм, що входять в ПО, з пошуком і виправленням в них фіксуються при тестуванні помилок. Вона фактично включає налагодження кожного програмного модуля і налагодження сполучення модулів.



1.2. комплексна налагодження . Тестування ПЗ в цілому з пошуком і виправленням фіксуються при тестуванні помилок у всіх документах (включаючи тексти програм ПЗ), що відносяться до ПО в цілому. До таких доку-ментам відносяться визначення вимог до ПЗ, специфікація якості ПЗ, функціональна специфікація ПЗ, опис архітектури П.О. і тексти програм ПЗ.

2.1. Синтаксична налагодження. Синтаксичні помилки виявляє компілятор, тому виправляти їх досить легко.

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

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

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

При цьому тестер або програміст заздалегідь повинні отримати контрольний результат з яким буде йти звірка роботи перевіряється коду.

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

Засоби автоматичного тестування вихідного коду програм.

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

Прикладами таких систем можуть бути: вбудований модуль doctest в Python і багатомовна бібліотека тестування xUnit, поширювана на умовах GNU / GPL і LGPL. Основа застосування всіх цих засобів і технік це розбиття однієї великої завдання на ряд чітких і більш маленьких завдань.


23. Основні принципи об'єктно-орієнтованого програмування: інкапсуляція, успадкування, поліморфізм. Відмінність об'єктно-орієнтованого підходу від модульного при розробці програм

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

прототип - це об'єкт-зразок, за образом і подобою якого створюються інші об'єкти.

клас

поля, Описані в класі, використовують для зберігання складових стану об'єкта, тобто поля визначають стан об'єктів.

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

об'єкт - змінна типу клас

Принципи об'єктно-орієнтованого програмування.

1. Абстракція.Абстрагування - це спосіб виділити набір значущих характеристик об'єкта, виключаючи з розгляду незначущі. Відповідно, абстракція - це набір всіх таких характеристик.

2. Інкапсуляція.

Інкапсуляція - принцип ООП, згідно з яким в класі об'єднуються поля і методи.

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

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

Спадкування - можливість конструювання нових більш складних класів з уже наявних за допомогою додавання полів і визначення нових методів ( принцип ієрархічності).

Клас, від якого виробляється спадкування, називається базовим, Батьківським або суперкласом. Новий клас - нащадком, Спадкоємцем або похідним класом. Механізм успадкування забезпечує класу-нащадка можливість використання полів і методів батьківських класів. Ланцюжки спадкування можуть бути необмеженої довжини. При цьому різні методи для кожного із спадкоємців дозволяється перевизначати.

4. Поліморфізм.Поліморфізм - це властивість системи використовувати об'єкти з однаковим інтерфейсом без інформації про тип і внутрішню структуру об'єкта.

Поліморфізм ( "різноманіття") в програмуванні - можливість зміни коду програми у відповідності зі значенням деяких параметрів.

4.1. чистий поліморфізм - можливість різної інтерпретації коду функції в залежності від типу аргументів.

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

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

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

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

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

Відмінність об'єктно-орієнтованого підходу від модульного.

1) Об'єктно-орієнтована підхід до проектування програм. продуктів заснований на:

- виділення класів об'єктів;

- встановлення характерних властивостей об'єктів і методів їх обробки;

- створення ієрархії класів, успадкування властивостей об'єктів і методів їх обробки.

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

Слід зауважити, що поняття «модуль» не збігається в даному випадку з поняттям «модуль» (в сенсі «бібліотека») мови Паскаль. Це повинна бути проста, замкнута (незалежна) програмна одиниця (процедура або функція), осяжна, що реалізує тільки одну функцію. Для написання одного модуля має бути досить мінімальних знань про текст інших, як викликають, так і спричинених.

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


24. Класи і об'єкти: їх визначення, співвідношення між ними. Роль складових класу - полів, властивостей, методів. Специфікатори доступу published, public, private, protected. Конструктори і деструктори, їх роль. Події та їх використання в управлінні програмою

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

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

Співвідношення класу і об'єкту:

Поняття класу є більш загальним, ніж поняття об'єкта. Об'єкт є екземпляром класу. Клас може розглядатися як сукупність об'єктів (подібно до того, як безліч є сукупність елементів). Клас може бути елементарним або поділятися на підкласи (подібно до того як безліч поділяється на підмножини). Наприклад, клас PERSON містить підклас STUDENT, який, в свою чергу, містить об'єкт John_Smith.

класи мають(Наприклад, в Delphi):

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

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

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

Поля, властивості та методи класу називаються членами класу.

Змінна, описана як клас, фактично є покажчиком на екземпляр класу. В об'єктно-орієнтованої програми із застосуванням класів кожен об'єкт є «екземпляром» деякого конкретного класу, і інших об'єктів не передбачено.

Специфікатори доступу published, public, private, protected.

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

За замовчуванням (в Delphi) видимість батьківських членів класу успадковується в точності, проте дозволено підвищувати видимість - робити поля, властивості і методи більш доступними. Зниження видимості не допускається.

рівні інкапсуляції(Доступність будь-яких членів класу):

1) Public. Члени класу, що знаходяться в даному розділі, доступні з будь-якої точки програми.

2) Private. Члени класу доступні тільки в тому модулі, де даний клас описаний. За замовчуванням вважається, що всі поля класу розташовані в розділі private.

3) Protected. Члени класу доступні в тому модулі, де даний клас описаний, а також всередині методів класів, які є спадкоємцями даного класу і описаних в інших модулях.

4) Published. Члени класу, що знаходяться в даному розділі, доступні з будь-якої точки програми. В цьому розділі розміщуються властивості класу: поля, доступні для редагування і зміни значень під час проектування і з інспектора об'єктів.

5) Automated. Члени класу, що знаходяться в даному розділі, доступні з будь-якої точки програми. Описи дозволяється розміщувати в цьому розділі, тільки якщо клас є спадкоємцем стандартного класу TAutoObject(В Delphi), призначеного для створення так званих серверів автоматизації при використанні технології СОМ (Competent Object Model).

Конструктори і деструктори.

коли об'єкт створюється, Одноразово викликається спеціальний метод, званий конструктором. У ньому виконуються різні дії по початковій ініціалізації полів об'єкта.

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

Події та їх використання в управлінні програмою.

Подія в ООП - це повідомлення, яке виникає в різних точках виконуваного коду при виконанні певних умов.

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

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


25. Основні відмінності мови Object Pascal (Delphi) від Turbo Pascal. Динамічні масиви в Delphi: опис, особливості, застосування

Turbo Pascal - інтегроване середовище розробки для мови програмування Pascal і мову програмування в цьому середовищі, діалект мови Паскаль від фірми Borland.

Delphi - середовище програмування, в якій використовується мова програмування Object Pascal.

Object Pascal - результат розвитку мови Turbo Pascal, Який, в свою чергу, розвинувся з мови Pascal. Pascal був повністю процедурним мовою.

Turbo Pascal, Починаючи з версії 5.5, додав в Pascal об'єктно-орієнтовані властивості, а в Object Pascal - динамічну ідентифікацію типу даних з можливістю доступу до метаданих класів (тобто до опису класів і їх членів) в компільовані коді, також званому інтроспекцією - дана технологія отримала позначення RTTI.

Так як всі класи успадковують функції базового класу TObject, то будь-який покажчик на об'єкт можна перетворити до нього, після чого скористатися методом ClassType і функцією TypeInfo, які й забезпечать интроспекцию.

Object Pascal ( Delphi) Є результатом функціонального розширення Turbo Pascal.

Об'єктна модель Delphi Pascal в порівнянні з моделлю, використаної Borland Pascal 7.0, є більш повною:

- обмеження доступу до полів і методів за рахунок визначення власного інтерфейсу до кожного полю класу (п'ять типів секцій при оголошенні класу, використання властивостей);

- більш розвинені механізми реалізації поліморфних методів (абстрактні, динамічні методи) ",

- кошти роботи з метаклассом (змінні метаклассом, методи класів, механізм RTTI).

Динамічні масиви в Delphi.

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

оголошення масиву: var My_Array: array of BaseType;

При такому оголошенні пам'ять не виділятися, і початковий розмір масиву - нульовий.

установка розміру масиву: SetLength (My_Array, 100);

Отримання числа елементів масиву: n: \u003d Length (My_Array);

Звернення до першого елементу масиву: My_Array: \u003d 10; x: \u003d My_Array;

оголошення двовимірного масиву: var A: array of array of BaseType;

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


26. Структура модулів в Delphi. Інтерфейсна, що виконується частини, яка ініціює і завершальна частини. Процедури і функції: особливості в Delphi

Проект в Delphi являє собою набір програмних одиниць - модулів.

Delphi дозволяє помістити свої функції і процедури в окремий модуль (Unit), А потім використовувати процедури і функції модуля в своїх програмах, вказавши ім'я модуля в списку модулів, необхідних програмі (інструкція uses). Модуль - це файл з розширенням * .pas.

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

Модуль складається з послідовності розділів. Кожен розділ починається ключовим словом і триває до початку наступного розділу. В розділ implementation (Реалізація) потрібно помістити процедури і функції, оголошені в розділі interface.

Структура модулів в Delphi.

Unit<имя>;

Interface <интерфейсная часть>

Implementation <исполняемая часть>

initialization <инициирующая часть>

finalization <завершающая часть>

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

unit ІмяМодуля;

interface // розділ інтерфейсу

(Опис процедур і функцій модуля, які можуть використовуватися іншими модулями.)

const // розділ оголошення констант

(Оголошення глобальних констант модуля, які можуть використовуватися процедурами і функціями модуля.)

type // роздав оголошення типів

(Оголошення глобальних типів модуля, які можуть використовуватися процедурами і функціями модуля)

var // розділ оголошення змінних

(Оголошення глобальних змінних модуля, які можуть використовуватися процедурами і функціями модуля)

implementation // розділ реалізації

(Опис (текст) процедур і функцій модуля!}

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

Процедури і функції в Delphi.

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

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

- коли підпрограма не повертає в основну програму ніяких даних;

- коли підпрограма повертає в викликала її програму більше ніж одне значення.

параметри - це вхідні дані.

оголошення процедури

procedure ІмяПроцедури (var параметр1: тип1; ... var параметр К: тип К);

THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму