Тема 4.5.2. Структурне тестування

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

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

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

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

Структурний підхід до тестування має ряд недоліків. Так тестові набори побудовані по даній стратегії:

• не виявляють пропущених маршрутів;

• не виявляють помилок, залежних від оброблюваних даних, наприклад, в операторові if (а - b) < eps - пропуск функції абсолютного значення abs виявиться лише, якщо а < Ь;

• не дають гарантії, що програма правильна, наприклад, якщо замість сортування по убуванню реалізовано сортування за збільшенням.

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

відповідний граф передач управління - на мал. 9.2, 6.

Procedure т (а, b: rеа1; var x: real);

begin

if (a1) and (b=0) then x: =x/a;

if (a=2) or (x>1) then x: =x+1;

end;

Формування тестових наборів для тестування маршрутів може здійснюватися по декільком критеріям:

• покриття операторів;

• покриття рішень (переходів);

• покриття умов;

• покриття рішень/умов;

• комбінаторне покриття умов.

 

 

 

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

Для фрагмента, алгоритм і граф якого представлені на мал. 9.2, можна було б

виконати кожного оператора один раз, задавши як вхідні дані а = 2, b = Про, х = 3. Але при цьому з другої умови виходить, що змінна х може набувати будь-якого значення, і в деяких версіях мови Pascal це значення перевірятися не буде (!).

Крім того:

• якщо при написанні програми в першій умові вказано: (а > 1) or (b = 0), то помилка виявлена не буде;

• якщо в другій умові замість х > 1 записане х > 0, то ця помилка теж не буде

виявлена;

• існує дорога 1-2-4-6 (див. мал. 9.2, би), в якому х взагалі не міняється і, якщо тут є помилка, вона не буде виявлена.

Таким чином, хоча при тестуванні дійсно необхідно задавати вихідні дані

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

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

Неважко бачити, що критерій покриття рішень задовольняє критерію покриття операторів, але є «сильнішим».

Програму можна протестувати по методу покриття рішень двома тестами, що покривають або дороги: 1-2-4-6, 1-2-3-4-5-6, або дороги:

1-2-3-4-6, 1-2-4-5-6, наприклад:

а = 3, Ь = 0, х = 3— дороги 1-2-3-4-5-6;

а = 2, b = 1, х = I — дорога 1-2-4-6.

Проте дорога, де х не міняється, буде перевірена з вірогідністю 50 %: якщо в другій умові замість умови х > 1 записане х < 1, то цими двома тестами помилка виявлена не буде.

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

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

Програма, алгоритм якої представлений на мал. 9.2, а, перевіряє чотири умови:

1) а>1; 2) Ь = 0; 3) а = 2; 4) х>1.

Необхідно реалізувати всі можливі ситуації:

а>1,а ? 1, b = 0, b?0, а = 2, а ? 2, х>1,х ? 1.

Тести, що задовольняють цій умові:

а = 2, Ь = 0, х = 4 — дорога 1-2-3-4-5-6, умови: 1 - так, 2 - так, 3 - так, 4 - так;

а = 1, b = 1, х = 1 — дорога 1-2-4-6, умови: 1 - ні, 2 - ні, 3 - ні, 4 - ні.

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

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

а= 1, b = 0, х = 3 — дорога 1-2-3-6, умови: 1 - ні, 2 - так, 3 - ні, 4 - так;

а = 2, b = 1, х = 1 — дорога 1-2-3-4-5-6, умови: 1 - так, 2 - ні, 3 - так, 4 - ні

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

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

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

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

а-2, b = 0, х = 4 — дорога 1-2-3-4-5-6, умови: 1 - так, 2 - так, 3 - так, 4 - так;

а = 1, Ь = 1, х = 1 — дорога 1-2-4-6, умови; 1 - ні, 2 - ні, 3 - ні, 4 - ні.

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

Для програми, алгоритм якої представлений на мал. 9.1, необхідно покрити тестами вісім комбінацій:

1)а >1, b = 0; 5) а = 2, х> 1;

2)а >1, b ?0; 6) а = 2, х ? 1;

3)а? 1,b = 0; 7) а ? 2, х> 1;

4)а? 1; b ?0; 8) а ? 2, х ? 1.

Ці комбінації можна перевірити чотирма тестами:

а = 2, b = 0, х = 4 — перевіряє комбінації (1) (5);

а = 2, b = 1, х = 1 — перевіряє комбінації (2) (6);

а = 1, b = 0, х = 2 — перевіряє комбінації (3) (7);

а = 1, b = 1, х = 1 — перевіряє комбінації (4) (8).

В даному випадку те, що чотирьом тестам відповідає чотири дороги, є збігом.

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

Таким чином, для програм, що містять лише одне умову на кожне рішення

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

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

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

обчислення;

• передавати управління кожному операторові, принаймні, один раз.

Термін «можливих» спожитий тут тому, що деякі комбінації умов можуть бути не реалізовуються. Наприклад, для комбінації k<0 і к>40 задати до неможливо.