## Конспект
**Тестирование белого ящика**: тесты строятся по внутренней структуре кода. Порядок такой:
1. **Пронумеровать код.** Подряд идущие операторы одного уровня получают один номер и становятся одним узлом. Каждое условие и каждый конец `if` или цикла получают отдельный узел.
2. **Построить потоковый граф** (похож на блок-схему): узлы это номера, дуги это переходы.
3. **Посчитать цикломатическую сложность V.** Любая из трёх формул даёт один результат:
- V = число предикатных узлов (из них выходят 2 стрелки) + 1
- V = дуги − узлы + 2
- V = число регионов графа, включая внешний
4. **Записать независимые пути.** Каждый путь должен содержать хотя бы одну дугу, которой не было в прошлых путях. Всего их V штук.
5. **Составить тесты:** по одному тесту на каждый путь, то есть подобрать входные данные, которые проведут программу по этому пути.
## Задание: факториал
**Код (Python):**
```python
def fact(n):
if n < 0: # 1
return 0 # 2
if n <= 1: # 3
return 1 # 4
result = 1 # 5
i = 2
while i <= n: # 6
result *= i # 7
i += 1
return result # 8
# 9 = выход (end if / end loop сходятся)
```
**Узлы (9):**
| Узел | Что в нём |
|---|---|
| 1 | `if n < 0` |
| 2 | `return 0` |
| 3 | `if n <= 1` |
| 4 | `return 1` |
| 5 | `result = 1; i = 2` |
| 6 | `while i <= n` |
| 7 | тело цикла |
| 8 | `return result`, он же end loop |
| 9 | конец функции |
**Дуги (11):** 1→2, 1→3, 2→9, 3→4, 3→5, 4→9, 5→6, 6→7, 7→6, 6→8, 8→9.
**Цикломатическая сложность** (все три способа дают 4):
- Предикатов 3 (узлы 1, 3, 6), значит V = 3 + 1 = **4**.
- 11 − 9 + 2 = **4**.
- Регионов 4: три внутренних (петля цикла и два «обхода») плюс внешний.
**Независимые пути:**
1. 1 – 2 – 9
2. 1 – 3 – 4 – 9
3. 1 – 3 – 5 – 6 – 8 – 9 (цикл не выполняется)
4. 1 – 3 – 5 – 6 – 7 – 6 – 8 – 9 (цикл выполняется)
**Тесты:**
| № | Путь | Вход `n` | Ожидаемый результат |
|---|---|---|---|
| 1 | 1-2-9 | -5 | 0 |
| 2 | 1-3-4-9 | 0 (или 1) | 1 |
| 3 | 1-3-5-6-8-9 | нет такого входа | – |
| 4 | 1-3-5-6-7-6-8-9 | 3 | 6 |
Путь 3 недостижим. При `n ≥ 2` условие `i <= n` с `i = 2` всегда истинно, поэтому цикл выполнится минимум один раз. В отчёте это стоит указать как недостижимый путь.
В качестве запасного теста возьмите `n = 5`, ожидаемый результат 120. Он проверяет несколько итераций цикла.