Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
30.05.2020
Размер:
134.66 Кб
Скачать

3 Організація тестування

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

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

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

Пункт специфікації: "Метод Power повинен приймати вхідні параметри: x - ціле число, возводимое в ступінь, і n - ненегативний порядок ступеня. Метод повинен повертати обчислене значення xn ".

Виконуємо метод з наступними параметрами: Power(2,2)

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

У процесі тестування Оракул послідовно одержує елементи множині (X,мY) і відповідні їм результати обчислень (X,Yв) для ідентифікації фактів розбіжностей (test incident).

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

  • "Виконання програми в розумі" (deskchecking).

  • Вставка операторів протоколювання (друкування) проміжних результатів (logging).

  • Приклад вставки операторів протоколювання проміжних результатів

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

// Метод обчислює ненегативну ступінь n числа x

double Power(double x, int n)

{

double z=1;

int i;

for (i=1;n>=i;i++)

{

z = z*x;

printf("i = %d z = %f\n", i, z);

}

return z;

}

2.3. Вихідний текст методу Power із вставкою оператора протоколювання

  • Покрокове виконання програми (single-step running).

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

  • Виконання із замовленими зупинками (breakpoints), аналізом трас (traces) або станів пам'яті - дампів (dump).

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

Коли виконання в контрольній точці припиняється, програма переходить у режим «останову» (break mode). Вхід у режим «останову» не перериває й не закінчує виконання програми й дозволяє аналізувати стан окремих змінних або структур даних. Повернення з режиму break mode у режим виконання може відбутися в будь-який момент за бажанням користувача.

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

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

Наприклад: на Рис. 2.1 умовно зображений керуючий граф деякої програми. Траса, що проходить через вершини 0-1-3-4-5 зафіксована в Табл. 2.1. Рядки таблиці відображають вершини керуючого графа програми, або breakpoints, у яких фіксувалися поточні значення замовлених користувачем змінних.

Рис. 2.1. Керуючий граф програми

Таблиця 2.1. Траса, що проходить через вершини 0-1-3-4-5

№ вершини

Значення x

Значення z

Значення n

Значення i

0

3

1

2

не зафіксовано

1

3

1

2

не зафіксовано

3

3

1

2

1

4

3

3

2

2

5

3

3

2

не зафіксовано

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

  • Реверсивне (зворотне) виконання (reversible execution)

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

Приклад зворотного виконання для програми обчислення ступеня числа x

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

// Метод обчислює ненегативну ступінь n числа x

double PowerNonNeg(double x, int n)

{

double z=1;

int i;

printf("x=%f z=%f n=%d\n",x,z,n);

if (n>0)

{

printf("x=%f z=%f n=%d\n",x,z,n);

for (i=1;n>=i;i++)

{

z = z*x;

printf("x=%f z=%f n=%d i=%d\n",x,z,n,i);

}

}

else printf("Помилка! Ступінь числа n повинна бути більше 0.\n");

return z;

}

2.4. Вихідний код з фіксацією результатів виконання операторів

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

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

Тестування закінчується, коли виконалося або "пройшло" (pass) успішно достатню кількість тестів відповідно до обраного критерію тестування.

Тестування – це:

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

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

  • Контрольоване виконання програми на кінцевій множині тестових даних й аналіз результатів цього виконання для пошуку помилок [IEEE Std 829-1983].

Наскрізний приклад тестування

Візьмемо програму, що трохи відрізняється від Приклад 2.4:

// Метод обчислює ступінь n числа x

#include <stdio.h>

double Power(int x, int n)

{

int z=1;

int i;

for (i=1;n>=i;i++)

{

z = z*x;

}

return z;

}

void main(void)

{

int x;

int n;

printf("Enter x:");

if(scanf("%d",&x))

{

if ((x>=0) & (x<=999))

{

printf("Enter n:");

if(scanf("%d",&n)) {

if ((n>=1) & (n<=100))

{

printf("The power n of x is %f\n", Power(x,n));

}

else

{

printf("Error : n must be in [1..100]\n");

}

}

else

{

printf("Error : Please enter a numeric argument\n");

}

}

else

{

printf("Error : x must be in [0..999]\n");

}

}

else

{

printf("Error : Please enter a numeric argument\n");

}

}

2.5. Інший приклад обчислення ступеня числа

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

Специфікація програми

  • На вхід програма приймає два параметри: x - число, n - ступінь. Результат обчислення виводиться на консоль.

  • Значення числа й ступені повинні бути цілими.

  • Значення числа, що підноситься в ступінь, повинні лежати в діапазоні - [0..999].

  • Значення ступеня повинні лежати в діапазоні - [1..100].

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

Розробка тестів

  • Визначимо області еквівалентності вхідних параметрів.

  • Для x - числа, що підноситься в ступінь, визначимо класи можливих значень:

    • x < 0 (помилкове)

    • x > 999 (помилкове)

    • x - не число (помилкове)

    • 0 <= x <= 999 (коректне)

  • Для n - ступеня числа:

    • n < 1 (помилкове)

    • n > 100 (помилкове)

    • n - не число (помилкове)

    • 1 <= n <= 100 (коректне)

Аналіз тестових випадків

  • Вхідні значення: (x = 2, n = 3) (покривають класи 4, 8).

  • Очікуваний результат: The power n of x is 8.

  • Вхідні значення: {(x = -1, n = 2),(x = 1000, n = 5)} (покривають класи 1, 2).

  • Очікуваний результат: Error : x must be in [0..999].

  • Вхідні значення: {(x = 100, n = 0),(x = 100, n = 200)} (покривають класи 5,6).

  • Очікуваний результат: Error : n must be in [1..100].

  • Вхідні значення: (x = ADS n = ASD) (покривають класи еквівалентності 3, 7).

  • Очікуваний результат: Error : Please enter a numeric argument.

Перевірка на граничні значення:

  • Вхідні значення: (x = 999 n = 1).

  • Очікуваний результат: The power n of x is 999.

  • Вхідні значення: x = 0 n = 100.

  • Очікуваний результат: The power n of x is 0.

Оцінка результатів виконання програми на тестах

У процесі тестування Оракул послідовно одержує елементи множині (X,Y) і відповідні їм результати обчислень YВ. У процесі тестування виробляється оцінка результатів виконання шляхом порівняння одержуваного результату з очікуваним.

Соседние файлы в папке Тестування