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

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

@potapov_me

Платформа

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

Контент

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

Компания

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

Аккаунт

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

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

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Реальные кейсы из Production
real_world_cases

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

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

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

«Баги, которые Hypothesis нашёл в реальных проектах — учитесь на чужих ошибках.»

#Кейс 1: Баг в сортировке с float('inf')

#Контекст

Команда разрабатывала систему аналитики с сортировкой данных по различным метрикам.

#Проблема

def sort_by_metric(data: list[dict], metric: str) -> list[dict]: return sorted(data, key=lambda x: x[metric]) # Тест @given(st.lists(st.builds(dict, value=st.floats()))) def test_sort_preserves_elements(data): result = sort_by_metric(data, 'value') assert len(result) == len(data)

#Найденный баг

Falsifying example: data=[{'value': 0}, {'value': inf}, {'value': -inf}]

AssertionError: sorted список не сохраняет порядок при сравнении

Причина: сравнение с inf и -inf работало корректно, но при наличии nan сортировка давала непредсказуемый результат.

#Решение

from math import isfinite def sort_by_metric_safe(data: list[dict], metric: str) -> list[dict]: def safe_key(x): value = x[metric] if not isfinite(value): return float('inf') if value > 0 else float('-inf') return value return sorted(data, key=safe_key)

Урок: Специальные float значения (inf, -inf, nan) должны явно обрабатываться.

#Кейс 2: Переполнение при расчёте скидки

#Контекст

E-commerce платформа с системой скидок.

#Проблема

def calculate_discount(price: float, quantity: int, discount_percent: float) -> float: total = price * quantity discount = total * (discount_percent / 100) return total - discount

#Найденный баг

Falsifying example: price=1e+308, quantity=10, discount_percent=0.0

OverflowError: result too large

Причина: 1e+308 * 10 превышает максимальное float значение.

#Решение

from decimal import Decimal def calculate_discount_safe(price: Decimal, quantity: int, discount_percent: Decimal) -> Decimal: total = price * quantity discount = total * (discount_percent / 100) return total - discount

Урок: Для финансовых вычислений используйте Decimal, не float.

#Кейс 3: Timezone баг при сравнении дат

#Контекст

Система бронирования с проверкой доступности дат.

#Проблема

from datetime import datetime def is_available(booking_start: datetime, booking_end: datetime, check_date: datetime) -> bool: return not (booking_start <= check_date <= booking_end)

#Найденный баг

Falsifying example: 
  booking_start=datetime(2023, 1, 1, tzinfo=UTC),
  booking_end=datetime(2023, 12, 31, tzinfo=UTC),
  check_date=datetime(2023, 6, 15)  # naive datetime

TypeError: can't compare offset-naive and offset-aware datetimes

Причина: Смешение timezone-aware и naive datetime.

#Решение

def is_available_safe(booking_start, booking_end, check_date): # Нормализация к одному формату def ensure_utc(dt): if dt.tzinfo is None: return dt.replace(tzinfo=timezone.utc) return dt.astimezone(timezone.utc) start = ensure_utc(booking_start) end = ensure_utc(booking_end) check = ensure_utc(check_date) return not (start <= check <= end)

Урок: Всегда используйте timezone-aware datetime или явно обрабатывайте naive.

#Кейс 4: Unicode баг в валидации email

#Контекст

Валидация email при регистрации пользователей.

#Проблема

import re def is_valid_email(email: str) -> bool: pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' return bool(re.match(pattern, email))

#Найденный баг

Falsifying example: email='пользователь@пример.рф'

AssertionError: Валидный email отклонён

Причина: Regex не поддерживает Unicode домены и локальные части.

#Решение

import re def is_valid_email_unicode(email: str) -> bool: # Более сложный паттерн с Unicode поддержкой pattern = r'^[\w.%+-]+@[\w.-]+\.[\w]{2,}$' return bool(re.match(pattern, email, re.UNICODE))

Урок: Учитывайте Unicode при валидации пользовательских данных.

#Кейс 5: Race condition в stateful тесте

#Контекст

Система управления очередью задач с конкурентным доступом.

#Проблема

class TaskQueue: def __init__(self): self.queue = [] self.processing = None def start_task(self): if self.queue and self.processing is None: self.processing = self.queue.pop(0) def complete_task(self): if self.processing: self.processing = None

#Найденный баг через stateful testing

Falsifying example:
  state = TaskQueueMachine()
  state.add_task()
  state.add_task()
  state.start_task()
  state.start_task()  # Второй вызов когда processing уже установлен!

AssertionError: processing должен быть None перед start_task

Причина: Отсутствие проверки в start_task что processing уже установлен.

#Решение

def start_task_safe(self): if self.queue and self.processing is None: self.processing = self.queue.pop(0) # Явно игнорируем вызов если processing уже есть

Урок: Stateful testing находит race conditions и ошибки состояния.