Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Темы на модуль(лекции).doc
Скачиваний:
0
Добавлен:
25.11.2019
Размер:
378.37 Кб
Скачать

Підсумок вивченого розділу

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

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

  • коментарям і їхній відповідності тексту програми ;

  • умовам в операторах умовного вибору ( IF, CASE ) і циклу;

  • складним логічним виразам;

  • - можливості незавершення ітераційних циклів ( WHILE, REPEAT, LOOP ).

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

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

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

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

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

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

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

  3. наявність у тексті програми фрагментів, що ніколи не виконуються;

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

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

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

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

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

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

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

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

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

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

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

Інше визначення тестування ( у Г. Майерса ): тестування - це процес виконання програми з метою виявлення в ній помилок. Таке визначення мети стимулює пошук помилок у програмах. Звідси також ясно, що "вдалим" тестом є такий, на якому виконання програми завершилося з помилкою. Навпроти, "невдалим можна назвати тест, що не дозволив виявити помилку в програмі.

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

У Майерса сформульовані також основні принципи організації тестування :

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

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

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

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

5) необхідно ретельно підбирати тест не тільки для правильних ( передбачених ) вхідних даних, але й для неправильних (непередбачених) ;

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

7) варто зберігати використані тести (для підвищення ефективності повторного тестування програми після її модифікації або установки в замовника) ;

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

9) варто враховувати так званий "принцип скупчення помилок" : імовірність наявності не виявлених помилок у деякій частині програми прямо пропорційна числу помилок, уже виявлених у цій частині ;

10) варто завжди пам'ятати , що тестування - творчий процес, а не ставитися до нього як до рутинного заняття.

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

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

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

Але навіть якщо припустити, що вдалося досягти повного структурного тестування деякої програми, у ній проте можуть міститися помилки, тому що:

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

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

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

1) тестування окремих модулів;

2) спільне тестування модулів;

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

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

На перших двох етапах використовуються насамперед методи структурного тестування, тому що:

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

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

При тестуванні як окремих модулів, так і їхніх комплексів повинні бути вирішені два завдання :

1) побудова ефективної безлічі тестів ;

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

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

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

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

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

З іншої сторони покриття умов може не забезпечувати покриття всіх переходів. Наприклад, конструкція IF A AND B THEN... вимагає за критерієм покриття умов двох тестів (наприклад, A=true, B=false і A=false, B=true ), при яких може не виконуватися оператор, розташований в then - галузі оператора if.

Актуальним залишається завдання створення інструментальних засобів, що дозволяють :

1) накопичувати інформації про покриті й непокриті гілки для всіх використаних тестів ;

2) виділяти розроблювачеві ще не покриті при тестуванні ділянки програми, полегшуючи вибір наступних тестів ;

3) підтримувати потужніші критерії повноти структурного тестування.