Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Python Hypothesis: Property-Based Testing
Python экосистема·12 тем·120 вопросов·уровень Senior

Python Hypothesis: Property-Based Testing

Глубокое погружение в property-based тестирование с использованием библиотеки Hypothesis. Курс для опытных разработчиков, которые хотят выйти за рамки примерочных тестов и научиться находить сложные баги автоматически. Вы изучите внутреннее устройство Hypothesis, создание кастомных стратегий, stateful testing, интеграцию с FastAPI/Django, тестирование баз данных, performance-тестирование и реальные кейсы из production. Курс включает 12 тем с подробными туториалами и более 60 вопросов с развёрнутыми объяснениями.

Начать курс

Hypothesis: property-based тестирование

Обычный тест проверяет пример: на входе [3, 1, 2], на выходе [1, 2, 3]. Property-based тест проверяет утверждение: для любого списка результат отсортирован и содержит те же элементы. Hypothesis сам подбирает входные данные, находит контрпример — и, что важнее, ужимает его до минимального: не список из ста случайных чисел, а [0, -0.0] или пустая строка с нулевым байтом.

Двенадцать тем. Начало — философия подхода и границы: где примеры принципиально недостаточны, а где property-based тест только усложняет жизнь. Затем внутреннее устройство: как работают фаза генерации и фаза сжатия, почему shrinker выдаёт именно такой минимальный пример и как это использовать при отладке.

Дальше стратегии — основной рабочий инструмент: встроенные, их композиция, фильтрация и отображение, затем свои через @composite и рекурсивные для древовидных структур. Отдельная большая тема — stateful testing: RuleBasedStateMachine генерирует не данные, а последовательности вызовов, и находит ошибки, возникающие только при определённом порядке операций — то, что вручную не подбирают.

Прикладная половина: тестирование REST и GraphQL в FastAPI и Django, модели SQLAlchemy, миграции и транзакции, Pydantic-модели и JSON-схемы, проверка того, что сериализация и десериализация возвращают исходный объект. Затем поиск узких мест по производительности, настройка в CI — где недетерминированность тестов требует отдельного разговора про профили и воспроизводимость падений через сохранённые примеры.

Финал — продвинутые паттерны и антипаттерны (главный: свойство, переписывающее реализацию другими словами, — такой тест не проверяет ничего) и разбор реальных багов, найденных этим способом.

Для опытных разработчиков. Нужен pytest на рабочем уровне.

  1. 1

    Введение в Property-Based Testing

    Философия PBT, почему unit tests недостаточны, базовые концепции hypothesis

    10 вопросов
  2. 2

    Внутреннее устройство Hypothesis

    Как работает shrinker, пример minimization, фаза генерации и фаза сжатия

    10 вопросов
  3. 3

    Глубокое погружение в стратегии

    Все встроенные стратегии, композиция, фильтрация, mapped strategies

    10 вопросов
  4. 4

    Создание собственных стратегий

    Написание кастомных стратегий, @composite, recursive стратегии

    10 вопросов
  5. 5

    Stateful Testing и машины состояний

    RuleBasedStateMachine, инварианты, тестирование сложных систем

    10 вопросов
  6. 6

    Тестирование API

    Интеграция с FastAPI и Django, тестирование REST и GraphQL endpoints

    10 вопросов
  7. 7

    Тестирование баз данных и ORM

    Тестирование SQLAlchemy моделей, миграций, транзакций

    10 вопросов
  8. 8

    Валидация данных и схем

    Тестирование Pydantic моделей, JSON-схем, сериализации

    10 вопросов
  9. 9

    Performance и нагрузочное тестирование

    Использование hypothesis для performance тестов, поиск узких мест

    10 вопросов
  10. 10

    Интеграция с CI/CD и Production

    Настройка в CI, database seeding, hypothesis в production

    10 вопросов
  11. 11

    Продвинутые паттерны и антипаттерны

    Best practices, типичные ошибки, оптимизация тестов

    10 вопросов
  12. 12

    Реальные кейсы из Production

    Разбор реальных багов, найденных с помощью hypothesis

    10 вопросов
  13. Зачёт

    Доступен после всех тем (0 из 12)

  14. Экзамен

    Доступен после зачёта

26 / 26

Property-Based Testing (PBT)

Основы PBT

Парадигма тестирования, в которой разработчик описывает свойства (инварианты) системы, которые должны выполняться для всех входных данных из определённой области. Тестовая фреймворк автоматически генерирует множество входных значений для проверки этих свойств.

Пример

Вместо проверки sort([3,1,2]) == [1,2,3], мы проверяем: для любого списка lst, sorted(lst) возвращает список той же длины с теми же элементами в отсортированном порядке.

Связанные термины

Unit Testing

Основы PBT

Традиционный подход к тестированию, при котором разработчик пишет тесты с конкретными входными значениями и ожидаемыми результатами. Каждый тест проверяет одно конкретное поведение функции или метода.

Пример

def test_add(): assert add(2, 3) == 5

Связанные термины

Инвариант (Invariant)

Основы PBT

Условие или свойство, которое должно оставаться истинным при любых допустимых входных данных и в любом состоянии системы. В PBT инварианты — это утверждения, которые проверяются для всех сгенерированных тестовых случаев.

Пример

Инвариант для функции reverse: reverse(reverse(lst)) == lst для любого списка lst

Связанные термины

Стратегия (Strategy)

Стратегии

Объект Hypothesis, который описывает, как генерировать значения определённого типа. Стратегии определяют пространство возможных входных данных для теста и могут комбинироваться для создания сложных структур.

Пример

st.integers() — стратегия для генерации целых чисел; st.lists(st.text()) — стратегия для генерации списков строк

Связанные термины

@composite (Композитная стратегия)

Стратегии

Декоратор Hypothesis для создания пользовательских стратегий. Функция с @composite получает объект draw для генерации промежуточных значений и должна вернуть итоговое значение.

Пример

@composite def draw_string_with_length(draw): length = draw(st.integers(1, 100)) return draw(st.text(min_size=length, max_size=length))

Связанные термины

draw()

Стратегии

Метод объекта ConjectureData, доступный внутри @composite функций. Позволяет генерировать промежуточные значения из стратегий для построения более сложных структур.

Пример

value = draw(st.integers(min_value=0, max_value=100))

Связанные термины

Shrinker (Сжатие)

Ядро Hypothesis

Алгоритм Hypothesis, который после нахождения failing case пытается упростить входные данные до минимального воспроизводимого примера. Это значительно упрощает отладку, показывая наименьший набор данных, вызывающий ошибку.

Пример

Если тест падает на списке из 100 элементов, shrinker может найти, что ошибка воспроизводится уже на [0, -1]

Связанные термины

Minimization (Минимизация)

Ядро Hypothesis

Процесс уменьшения размера failing case до минимального воспроизводимого примера. Hypothesis использует эвристики для удаления лишних данных, уменьшения чисел, укорочения строк и коллекций.

Пример

Вместо строки длиной 5000 символов вы увидите строку длиной 3 символа, которая всё ещё вызывает ошибку

Связанные термины

Falsifying Example

Ядро Hypothesis

Конкретный набор входных данных, который нарушает указанное свойство (инвариант). Hypothesis ищет falsifying examples и при нахождении показывает минимальную версию после работы shrinker'а.

Пример

Falsifying example: lst=[0, float('inf'), -float('inf')] для свойства 'sorted сохраняет порядок элементов'

Связанные термины

@given

Ядро Hypothesis

Основной декоратор Hypothesis. Преобразует обычную тестовую функцию в property-based тест, автоматически генерируя входные данные согласно указанным стратегиям.

Пример

@given(st.lists(st.integers())) def test_sort(lst): assert len(sorted(lst)) == len(lst)

Связанные термины

Stateful Testing

Stateful Testing

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

Пример

Тестирование стека: генерируем последовательности push/pop и проверяем, что pop всегда возвращает последний push'нутый элемент

Связанные термины

RuleBasedStateMachine

Stateful Testing

Класс Hypothesis для stateful testing. Определяет правила (правила перехода состояний) и инварианты. Hypothesis автоматически генерирует последовательности применения правил.

Пример

class StackMachine(RuleBasedStateMachine): @rule(item=st.text()) def push(self, item): ... @invariant() def check_stack(self): ...

Связанные термины

Rule (Правило)

Stateful Testing

Метод в RuleBasedStateMachine, который может быть выполнен Hypothesis во время теста. Каждое правило имеет стратегию для генерации аргументов и изменяет состояние системы.

Пример

@rule(amount=st.floats(allow_nan=False, allow_infinity=False)) def deposit(self, amount): self.balance += amount

Связанные термины

Precondition (Предусловие)

Stateful Testing

Функция в stateful testing, которая определяет, может ли быть применено определённое правило в текущем состоянии. Если precondition возвращает False, правило не выполняется.

Пример

@precondition(lambda self: self.balance > 0) @rule(amount=st.floats()) def withdraw(self, amount): ...

Связанные термины

Example Generation (Генерация примеров)

Ядро Hypothesis

Процесс создания тестовых данных Hypothesis. Использует комбинацию случайной генерации, эвристик для краевых случаев и адаптивного поиска на основе предыдущих результатов.

Пример

Hypothesis автоматически включает: 0, 1, -1, None, пустые строки, границы типов данных

Связанные термины

Фильтрация (Filtering)

Стратегии

Метод ограничения стратегии путём исключения значений, не удовлетворяющих определённому условию. Использует .filter() или assume() для отбраковки неподходящих данных.

Пример

st.integers().filter(lambda x: x > 0) генерирует только положительные числа

Связанные термины

assume()

Стратегии

Функция для фильтрации входных данных внутри теста. Если assume() получает False, текущий пример отбрасывается и генерируется новый. В отличие от assert, не вызывает провал теста.

Пример

assume(x > 0) # Пропускает тест для неположительных x

Связанные термины

Рекурсивная стратегия

Продвинутые концепции

Стратегия для генерации рекурсивных структур данных (деревья, вложенные списки). Использует st.recursive() с базовой стратегией и функцией расширения.

Пример

st.recursive(st.integers(), lambda children: st.lists(children, max_size=3))

Связанные термины

Database Seeding

Продвинутые концепции

Механизм Hypothesis для сохранения failing cases в базу данных (по умолчанию .hypothesis/). При повторном запуске тесты сначала проверяют сохранённые примеры, что ускоряет отладку.

Пример

Hypothesis автоматически сохраняет failing cases в .hypothesis/examples/

Связанные термины

CI/CD Integration

Продвинутые концепции

Интеграция Hypothesis тестов в конвейер непрерывной интеграции. Включает настройку окружения, управление базой данных примеров и оптимизацию времени выполнения.

Пример

В CI: отключаем database, устанавливаем max_examples=100 для скорости

Связанные термины

Oracle Testing (Тестирование с оракулом)

Паттерны тестирования

Паттерн PBT, где результат функции сравнивается с результатом альтернативной реализации (оракула). Оракул может быть медленнее, но проще и надёжнее.

Пример

Сравниваем быстрый алгоритм сортировки с sorted() — оракулом

Связанные термины

Round-Trip Property

Паттерны тестирования

Свойство, проверяющее, что две обратные операции восстанавливают исходное значение. Классический паттерн для тестирования сериализации/десериализации, кодирования/декодирования.

Пример

decode(encode(x)) == x для любого корректного x

Связанные термины

Каноникализация (Canonicalization)

Паттерны тестирования

Паттерн PBT, где сравниваются не прямые результаты, а их канонические формы. Полезно, когда разные представления эквивалентны.

Пример

JSON {a:1, b:2} и {b:2, a:1} эквивалентны после сортировки ключей

Связанные термины

Coverage-Guided Generation

Ядро Hypothesis

Подход к генерации тестовых данных, при котором Hypothesis отслеживает покрытие кода и адаптирует стратегию для исследования новых путей выполнения.

Пример

Hypothesis автоматически исследует ветки кода, которые ещё не были покрыты

Связанные термины

Phantom Data (Фантомные данные)

Продвинутые концепции

Данные, которые проходят валидацию, но вызывают неожиданное поведение в бизнес-логике. Hypothesis особенно эффективен для поиска таких случаев.

Пример

Строка '0' проходит валидацию int, но может вызвать division by zero

Связанные термины

Edge Case (Краевой случай)

Основы PBT

Входные данные на границе допустимого диапазона или представляющие исключительную ситуацию. Hypothesis автоматически тестирует edge cases: пустые коллекции, None, границы числовых типов.

Пример

Для int: -2^31, 2^31-1, 0, -1, 1; Для списка: [], [один элемент]

Связанные термины

Частые вопросы о курсе «Python Hypothesis: Property-Based Testing»

Состав курса, уровни, практика и способы проверки знаний.

Что входит в курс «Python Hypothesis: Property-Based Testing»?

Курс включает 12 тем и 120 вопросов с разбором ответа. Начать можно с первой темы курса.

Для какого уровня рассчитан курс «Python Hypothesis: Property-Based Testing»?

Маршрут охватывает уровни Senior. Темы расположены от основы к более сложным инженерным задачам, поэтому можно начать с подходящего места и не пропускать важные зависимости.

Как проверить, что материал усвоен?

После прохождения тем доступен зачёт по курсу «Python Hypothesis: Property-Based Testing» — 20 случайных вопросов с порогом 80%. После зачёта открывается экзамен с развёрнутыми ответами и автоматической оценкой, приближённый к техническому собеседованию.

Курс «Python Hypothesis: Property-Based Testing» бесплатный?

Да, курс полностью бесплатный: все 12 тем доступны без оплаты.