або вузлів програми, то при виникненні помилки її важко буде локалізувати.
Деякі принципи тестування програм.
Використовуйте підхід захисного програмування. Тобто передбачайте ще під час написання програми обробку ситуацій, які “не можуть статись ні за яких обставин”. І під час тестування обов’язково переконайтесь, що програма, захищена від некоректних даних. Хорошим прикладом тут може служити перевірка на нульовий або навіть від’ємний розмір масиву в програмі обчислення середнього значення елементів цього масиву.
Тестуйте граничні умови: при написанні кожного циклу передбачте перевірку того факту, що тіло циклу відпрацює потрібну кількість разів; в кожному умовному виразі переконайтесь, що розгалуження відбувається правильно. Основна ідея тут полягає в тому, що коли трапляється помилка, то з великою ймовірністю вона пов’язана саме з виходом за граничні значення. І навпаки, якщо програма працює правильно при граничних значеннях тестових даних, то скоріше за все вона поводиться коректно і у звичайних умовах.
Аналізуйте результати тестування. Вище вже йшлося про те, що одержані результати тесту мають співпадати з очікуваними значеннями. Існують різні способи перевірки результатів:
обчисліть для порівняння результат іншим способом, наприклад, на калькуляторі;
використайте табличні дані;
порівняйте з результатом роботи іншої програми, яка обчислює той самий результат іншим способом;
в деяких випадках можна спробувати обернути результат тесту – чи одержите ви вхідні дані (така ситуація можлива, наприклад для програм шифровки або стискання інформації) ?
Оцінюйте обсяг тестів. Тестування не можна вважати завершеним, поки кожний оператор програми не буде перевірено.
Деякі прийоми тестування.
В багатьох випадках процес тестування можна автоматизувати. Тобто, коли необхідно виконати багато тестових прогонів, кожен раз порівнюючи велику кількість результатів, можна написати програму, яка буде виконувати потрібні запуски. При цьому контрольні значення можуть міститись в деякому файлі на диску, який автоматично порівнюється з файлом вихідних даних програми.
Інший ефективний прийом тестування називають стресовим тестуванням – програма перевіряється дуже великими об’ємами вхідних даних, сгенерованих комп’ютером, наприклад, датчиком випадкових чисел. Такі випадкові дані можуть бути дуже ефективними для перевірки можливості переповнень масивів, файлів, змінних-лічильників.
Інші види тестів базуються на зумисному використанні некоректних даних. Будь-який блок програми, який одержує вхідні дані ззовні, повинен перевіряти їх, перш ніж використовувати. Історія програмних помилок включає дуже багато не тільки курйозних, але і сумних епізодів. Про один з них можна прочитати в [10]: “В листопаді 1998 року в журналі Scientific American був описаний інцидент, що стався на борту американського ракетного крейсера Yorktown. Член команди помилково замість значущого числа ввів 0, що призвело до помилкового ділення на нуль. Помилка розрослася і врешті решт силова установка корабля виявилася виведеною з ладу. Декілька годин Yorktown дрейфував волею хвиль – а все через те, що в програмі не було здійснено перевірку діапазону вхідних даних.”
Види тестових даних.
Таким чином, ретельний підхід до тестування вимагає ретельного ж готування тестових даних. Можна виділити три основних види тестових даних.
Тестові дані готуються програмістом. До них відносяться спеціально підготовані контрольовані дані та випадкові дані, сгенеровані деякою програмою.
Реальні дані, модифіковані спеціальним чином, щоб перевірити програми контролю вхідних даних (наприклад, в реальні дані вноситься помилкова інформація).
Реальні дані в повному об’ємі можна використовувати для заключних тестових випробувань.
Кожний з описаних видів тестових даних має свої переваги та недоліки, але їх спільне використання здатне забезпечити необхідний мінімум тестування вашої програми. При цьому процес тестування програми може бути розподілений на три етапи:
перевірка в нормальних умовах (тестові дані знаходяться всередині допустимого діапазона значень);
перевірка в критичних умовах (тестові дані наближаються до меж допустимого діапазона значень);
перевірка в екстремальних умовах (тестові дані знаходяться за межами допустимого діапазона значень).
Кожний з трьох етапів повинен гарантувати отримання вірних результатів при вірних вхідних даних і повідомлення про помилку (причому з деталюванням виду помилки) при невірних даних.
Нижче в таблиці наведено приклади тестування програми, яка повинна обчислювати довжину головної діагоналі прямокутного паралелепіпеда із сторонами A, B, C.
Номер тесту | Тестові дані
(A, B, C) | Коментар
1 | 1, 1, 1 | Димовий тест
2 | 1, 2, 3 | Нормальні умови
3 | 0, 0, 0 | Нульовий тест (результат повинен дорівнювати нулю!)
4 | 0, 1, 2 | Критичні умови
Це не паралелепіпед! Що видасть програма?
5 | 1, 2, 0
6 | 1, 0, 2
7 | 1, -6, 3 | Екстремальні умови (невірні дані). Що видасть програма?
Нагадаємо головне правило тестування – програми необхідно тестувати!
І на завершення, оптимістичний прогноз: кожна остання помилка, знайдена в програмі, є насправді передостанньою.
Бажаємо успіхів в створенні та тестуванні ваших програм!
ЛІТЕРАТУРА
Н. Вирт. Систематическое программирование. – М.: Мир, 1977. – 183 с.
Ален И. Голуб. С и С++. Правила программирования. – М.: БИНОМ, 1996. – 272 с.
У. Дал, Э. Дейкстра, К. Хоор. Структурное программирование. – М.: Мир, 1973. – 247 с.
Э. Дейкстра. Дисциплина программирования. – М.: Мир, 1978. – 275 с.
Д. Ван Тассел. Стиль, разработка, эффективность, отладка и испытание программ. – М.: Мир, 1985. – 332 с.
М. Зелковиц, А. Шоу, Дж. Гэннон. Принципы разработки программного обеспечения. – М.: Мир, 1982. – 368 с.
Г. С. Иванова. Основы программирования: Учебник для вузов. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2002. – 416 с.
Г. С. Иванова. Технология программирования: Учебник для вузов. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2002. – 320 с.
Э. Йодан. Структурное проектирование и конструирование програм. – М.: Мир, 1979. – 415 с.
Б. Керниган, Р. Пайк. Практика программирования. – СПб.: Невский