Загрузка данных


## Конспект

**Тестирование белого ящика**: тесты строятся по внутренней структуре кода. Порядок такой:

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. Он проверяет несколько итераций цикла.