Path Testing (тестування шляхів) — це метод структурного тестування (white-box testing), при якому тестувальник аналізує всі можливі логічні шляхи через програму з метою створення тестів, що забезпечують максимальне покриття коду. Він базується на аналізі графа потоку управління (Control Flow Graph, CFG) програми.
Основні терміни
1. Граф потоку управління (Control Flow Graph, CFG)
- Представляє структуру виконання програми у вигляді графа.
- Вузли (nodes) — окремі інструкції, блоки або умовні оператори.
- Ребра (edges) — можливі переходи між вузлами, залежно від умов або порядку виконання.
2. Шлях (Path)
- Це послідовність вузлів і ребер, яка описує можливий маршрут виконання програми від початку до кінця.
3. Типи шляхів:
- Простий шлях (Simple Path): шлях, у якому вузли не повторюються.
- Циклічний шлях (Cyclic Path): шлях, що містить цикл (наприклад, while або for).
- Лінійно незалежний шлях: шлях, що містить хоча б одну нову гілку, якої немає в інших шляхах.
- Базисний шлях (Basis Path): мінімальний набір незалежних шляхів, що дозволяє досягти повного покриття гілок.
Мета Path Testing
- Перевірити всі можливі варіанти проходження програми.
- Виявити:
- логічні помилки,
- пропущені гілки або умови,
- мертвий код,
- небажані петлі (infinite loops),
- некоректну обробку умов.
Алгоритм проведення Path Testing
- Побудова графа потоку управління (CFG) для цільового фрагменту коду.
- Ідентифікація всіх можливих логічних шляхів у графі.
- Вибір набору незалежних шляхів (як правило, базисних шляхів).
- Створення тестових випадків, які дозволяють пройти ці шляхи.
- Виконання тестів і аналіз результатів.
Приклад
def max_of_three(a, b, c):
if a > b:
if a > c:
return a
else:
return c
else:
if b > c:
return b
else:
return c
Граф потоку управління:
[Start]
|
a > b?
/ \
T/ \F
[a > c?] [b > c?]
/ \ / \
T/ \F T/ \F
[a] [c] [b] [c]
Можливі шляхи:
- a > b і a > c → return a
- a > b і a <= c → return c
- a <= b і b > c → return b
- a <= b і b <= c → return c
Для повного покриття шляхів потрібно 4 тест-кейси:
- max_of_three(5, 2, 1) → шлях 1
- max_of_three(5, 2, 9) → шлях 2
- max_of_three(2, 5, 1) → шлях 3
- max_of_three(2, 5, 9) → шлях 4
Переваги Path Testing
- Дає високий рівень покриття логіки.
- Допомагає виявити складні помилки, які не видно при зовнішньому тестуванні.
- Підходить для критично важливих систем, де важлива точність логіки.
Недоліки
- Неможливість повністю охопити всі шляхи, якщо програма велика або має багато циклів (може бути нескінченна кількість шляхів).
- Висока складність, якщо код заплутаний або має багато умовних конструкцій.
Path Testing — це один із найточніших методів тестування програмної логіки.
Він дає змогу:
- виявити логічні помилки,
- досягти глибокого покриття коду,
- забезпечити якість критичних функцій.
Його доцільно використовувати при тестуванні окремих функцій, модулів, алгоритмів або життєво важливих систем, де необхідна висока точність і передбачуваність поведінки.