
Лекція 2.
Тема: Основні поняття тестування
Мета: ознайомити студентів з такими поняттями тестування як Формальний підхід, Інтерпретаційний підхід, Налагодження, Статичне тестування, Динамічне тестування, Оракул, deskchecking, logging, single-step running, Контрольна точка, break mode, Траса, Реверсивне (зворотне) виконання, Створення тестового набору, Прогін програми на тестах, Оцінка результатів виконання, Керуючий граф програми, Шлях, Гілка – шлях.
Що визначає якість програмного продукту?
Хто саме визначає, чи є дана розробка якісною?
До чого можна звести тестування з технічної точки зору?
На які етапи можна розділити розробку програмного продукту?
Як розподіляється час розробки додатку?
Яким чином можна перерозподілити час? За рахунок чого можливий такий перерозподіл?
ПЛАН
1 Концепція тестування
2 Основна термінологія
3 Організація тестування
4 Фази тестування
5 Керуючий граф програми
6 Основні проблеми тестування
1 Концепція тестування
Програма - це аналог формули у звичайній математиці.
Формула для функції f, отриманою суперпозицією функцій f1, f2, ... fn - вираз, що описує цю суперпозицію.
f = f1* f2* f3*... * fn
Якщо аналог f1,f2,... fn - оператори мови програмування, то їхня формула - програма.
Існує два методи обґрунтування істинності формул:
Формальний підхід або доказ застосовується, коли з вихідних формул-аксіом за допомогою формальних процедур (правил виводу) виводяться шукані формули й твердження (теореми). Вивід здійснюється шляхом переходу від одних формул до інших за строгими правилами, які дозволяють звести процедуру переходу від формули до формули до послідовності текстових підстановок:
A**3 = A*A*A
A*A*A = A -> R, A*R -> R, A*R -> R
Перевага формального підходу полягає в тім, що з його допомогою вдається уникати звертань до нескінченної області значень і на кожному кроці доказу оперувати тільки кінцевою безліччю символів.
Інтерпретаційний підхід застосовується, коли здійснюється підстановка констант у формули, а потім інтерпретація формул як осмислених тверджень в елементах множині конкретних значень. Істинність формул, що інтерпретуються, перевіряється на кінцевих множинах можливих значень. Складність підходу полягає в тому, що на кінцевих множинах комбінації можливих значень для реалізації вичерпної перевірки можуть виявитися досить великі.
Інтерпретаційний підхід використається при експериментальній перевірці відповідності програми своєї специфікації
Застосування інтерпретаційного підходу у формі експериментів над програмою, що виконується, становить суть налагодження й тестування.
2 Основна термінологія
Налагодження (debug, debugging) - процес пошуку, локалізації й виправлення помилок у програмі [IEEE Std.610-12.1990].
Термін " налагодження " у вітчизняній літературі використається подвійно: для позначення активності по пошуку помилок (власне тестування), по знаходженню причин їхньої появи й виправленню, або активності по локалізації й виправленню помилок.
Тестування забезпечує виявлення (констатацію наявності) фактів розбіжностей з вимогами (помилок).
Як правило, на фазі тестування здійснюється й виправлення ідентифікованих помилок, що включає локалізацію помилок, знаходження причин помилок і відповідне коректування програми тестованого додатка (Application Under Testing (AUT) або Implementation Under Testing (IUT)).
Якщо програма не містить синтаксичних помилок (пройшла трансляцію) і може бути виконана на комп'ютері, вона обов'язково обчислює яку-небудь функцію, що здійснює відображення вхідних даних у вихідні. Це означає, що комп'ютер на своїх ресурсах довизначає частково визначену програмою функцію до тотальної визначеності. Отже, судити про правильність або неправильність результатів виконання програми можна, тільки порівнюючи специфікацію бажаної функції з результатами її обчислення, що й здійснюється в процесі тестування.
Приклад пошуку й виправлення помилки
Налагодження забезпечує локалізацію помилок, пошук причин помилок і відповідне коректування програми (Приклад 2.1, Приклад 2.2).
// Метод обчислює ненегативну ступінь n числа x
double Power(double x, int n)
{
double z=1;
int i;
for(i=1;n>=i;i++)
{
z=z*x;
}
return z;
}
2.1 Вихідний текст методу Power
Якщо викликати метод Power з негативним значенням ступеня n Power(2,-1), то одержимо некоректний результат -2. Виправимо метод так, щоб помилкове значення параметра (неприпустиме по специфікації значення) ідентифікувалося спеціальним повідомленням, а повернений результат дорівнював 1 (Приклад 2.2).
// Метод обчислює ненегативну ступінь n числа x
double PowerNonNeg(double x, int n)
{
double z=1;
int i;
if (n>0)
{
for (i=1;n>=i;i++)
{
z = z*x;
}
}
else printf("Помилка! Ступінь числа n має бути більше 0.\n");
return z;
}
2.2 Скоректований вихідний текст
Якщо викликати скоректований метод PowerNonNeg(2,-1) з негативним значенням параметра ступеня, то повідомлення про помилку буде видано автоматично.
Тестування розділяють на статичне й динамічне:
Статичне тестування виявляє формальними методами аналізу, без виконання тестованої програми, невірні конструкції або невірні відносини об'єктів програми (помилки формального завдання) за допомогою спеціальних інструментів контролю коду - CodeChecker.
Динамічне тестування (власне тестування) здійснює виявлення помилок тільки в програмі, що виконується, за допомогою спеціальних інструментів автоматизації тестування - Testbed або Testbench.