JustCaptain kod-buduschego
6fd6c9a4bbd30b9f79d65f8e226e9c0fdc4255ba
Перейти к файлу
Код
MATERIAL.md

Да. Такой материал получится довольно большим — порядка 60–120 страниц, если оформить как учебное пособие. Ниже — первая глава. Она написана для человека, который никогда не занимался тестированием.

⸻

Методический материал по тестированию в Python

Часть 1. Введение

⸻

Глава 1. Что такое тестирование

Представим, что вы написали программу.

def add(a, b):
return a + b

Вы запускаете:

print(add(2, 3))

Получаете

5

Кажется, что всё работает.

Но возникает вопрос:

А если передать отрицательные числа?

add(-2, 3)

А если передать ноль?

add(0, 5)

А если передать строку?

add("2", "3")

А если передать список?

add([1], [2])

Каждый новый вариант входных данных — это отдельная проверка программы.

Такие проверки называются тестами.

⸻

Что такое тест

Тест — это код, который автоматически проверяет правильность работы другого кода.

Например.

Есть функция.

def square(x):
return x * x

Мы ожидаем:

square(2) == 4
square(3) == 9
square(-5) == 25
square(0) == 0

Можно проверить вручную.

print(square(2))
print(square(3))
print(square(-5))

Но это неудобно.

Лучше написать тест.

assert square(2) == 4
assert square(3) == 9
assert square(-5) == 25
assert square(0) == 0

Если все проверки проходят — ошибок нет.

Если хотя бы одна не проходит — Python сообщит об ошибке.

⸻

Зачем вообще нужны тесты

Представим программу из 10 строк.

Её ещё можно проверить руками.

Теперь представим программу из:

  • 500 строк;
  • 5000 строк;
  • 100000 строк.

После каждого изменения нужно убедиться, что ничего не сломалось.

Проверять вручную невозможно.

Поэтому проверки выполняет компьютер.

⸻

Пример без тестов

Есть функция.

def multiply(a, b):
return a * b

Работает.

Через неделю программист решил “улучшить” код.

Получилось так.

def multiply(a, b):
return a + b

Он случайно допустил ошибку.

Если тестов нет —

ошибка попадёт пользователям.

Если тесты есть —

они сразу покажут проблему.

⸻

Что проверяет тест

Тест всегда отвечает только на один вопрос.

Совпадает ли фактический результат с ожидаемым?

Например.

Ожидаем:

2 + 3 = 5

Получили:

5

Тест успешен.

Если получили

6

значит тест провален.

⸻

Структура любого теста

Любой тест состоит из трёх частей.

  1. Подготовка данных

a = 2
b = 3

⸻

  1. Выполнение действия

result = add(a, b)

⸻

  1. Проверка результата

assert result == 5

Полностью:

def add(a, b):
return a + b
a = 2
b = 3
result = add(a, b)
assert result == 5

Эта схема используется практически во всех тестах.

Её называют

Arrange → Act → Assert

или

Подготовка
↓
Действие
↓
Проверка

⸻

Что такое assert

assert — встроенная инструкция Python.

Она означает:

Проверь, что условие истинно.

Например.

assert 2 + 2 == 4

Ошибок нет.

Теперь

assert 2 + 2 == 5

Получим

AssertionError

То есть Python сообщает:

Проверка не прошла.

⸻

Почему assert удобнее print

Новички часто делают так.

print(square(5))

Получают

25

И считают, что всё хорошо.

Но если проверок тысяча?

25
36
49
64
81
...

Придётся глазами искать ошибки.

Гораздо лучше:

assert square(5) == 25

Если всё хорошо —

не будет никакого вывода.

Если плохо —

Python сразу остановится на ошибке.

⸻

Один тест — одна проверка

Плохо.

assert add(2, 3) == 5
assert add(4, 5) == 9
assert add(10, 10) == 20
assert add(100, 100) == 200

Лучше оформить каждую проверку отдельно (в рамках тестового фреймворка), чтобы при падении было сразу видно, какой именно сценарий не прошёл.

⸻

Какие бывают тесты

В Python существует несколько уровней тестирования.

Unit-тесты

Проверяют одну функцию.

Функция
↓
Тест

Например

def max_number(a, b):
return max(a, b)

Тестируем только её.

⸻

Интеграционные тесты

Проверяют работу нескольких частей программы вместе.

Например.

База данных
↓
API
↓
Бизнес-логика
↓
Ответ пользователю

Проверяется весь путь.

⸻

End-to-End тесты

Имитируют действия пользователя.

Например.

Открыть сайт
↓
Ввести логин
↓
Ввести пароль
↓
Нажать кнопку
↓
Проверить вход

Обычно выполняются через браузер.

⸻

Когда писать тест

Есть два подхода.

Первый.

Написать программу.

Потом написать тест.

Код
↓
Тест

Второй.

Сначала написать тест.

Потом код.

Тест
↓
Код

Этот подход называется TDD (Test-Driven Development).

Его мы рассмотрим позже.

⸻

Основные библиотеки для тестирования

В Python используются:

  • unittest — встроенная библиотека.
  • pytest — самый популярный инструмент.
  • doctest — тесты прямо в документации.
  • hypothesis — генерация тестовых данных.

На практике чаще всего используют pytest.

⸻

Итоги главы

После изучения первой главы необходимо понимать:

  • что такое тест;
  • зачем нужны тесты;
  • что проверяет тест;
  • как работает assert;
  • структуру Arrange → Act → Assert;
  • различие между unit-, интеграционными и end-to-end тестами;
  • почему pytest является наиболее распространённым инструментом тестирования в Python.

⸻

Такой курс логично построить в следующей последовательности:

  1. Введение в тестирование.
  2. assert и первые тесты.
  3. Библиотека unittest.
  4. Установка и основы pytest.
  5. Структура тестового проекта.
  6. Фикстуры (fixtures).
  7. Параметризация тестов.
  8. Моки (unittest.mock, pytest-mock).
  9. Тестирование исключений.
  10. Покрытие кода (coverage.py).
  11. Интеграционные тесты.
  12. Тестирование REST API.
  13. Тестирование баз данных.
  14. Тестирование веб-приложений с Selenium и Playwright.
  15. Непрерывная интеграция (CI) и автоматический запуск тестов.
  16. Архитектура крупных тестовых проектов, лучшие практики и типичные ошибки.