TGViewer
Библиотека питониста | Python, Django, Flask Библиотека питониста | Python, Django, Flask @pyproglib · 37.4K subscribers
Post #7742 2.11K
🧪 Перестаньте вручную писать десятки edge-case тестов

Обычный подход к тестированию выглядит так:
придумать странный input → написать тест → проверить поведение

Так можно покрыть десятки сценариев и всё равно пропустить баг.

Именно это часто происходит с edge cases.

Например, для URL-нормализатора можно написать десятки тестов с «необычными» URL, но упустить случай, когда вход состоит только из пробелов. Функция внезапно вернёт пустую строку — а тестов на это не окажется.

Здесь и помогает Hypothesis — библиотека для property-based testing.

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

Обычный тест:

def test_round_trip_specific():
assert decode(encode("hello world")) == "hello world"


Property-based тест:

from hypothesis import given
from hypothesis import strategies as st

@given(st.text())
def test_round_trip_any_string(s):
assert decode(encode(s)) == s


Теперь библиотека сама генерирует сотни и тысячи вариантов:
- пустые строки
- unicode-символы
- пробелы
- null bytes
- очень длинные значения
- нестандартные boundary cases

И цель у неё одна — сломать функцию.

Если найден баг, Hypothesis автоматически уменьшает вход до минимального воспроизводимого примера.

Получается что-то вроде:

Falsifying example:
url=''

Три свойства, которые полезны почти в любом проекте

1. Round-trip


@given(st.text())
def test_encode_decode(s):
assert decode(encode(s)) == s


2. Idempotency

Повторное применение функции не должно менять результат.

@given(st.text())
def test_normalize_idempotent(url):
assert normalize(url) == normalize(normalize(url))


3. Не должно падать

Очень недооценённый сценарий:

@given(st.text())
def test_parser_does_not_crash(s):
try:
parse(s)
except ValueError:
pass


Такие тесты часто находят баги там, где никто их не ожидал.

📍 Навигация: ВакансииЗадачиСобесы

Библиотека питониста

#буст
  • ❤ 4
  • 👍 2
  • 🔥 1
More from @pyproglib
  1. Sep 20, 2026👻 94% токенов уходят не на код Анализ запусков показал: основная часть токенов уходит на…
  2. Sep 19, 2026📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих» Мы написали и собр…
  3. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
  4. Sep 15, 2026⏱️ Справочник по Big-O в Python Для тех, кто хочет писать не просто работающий, а эффектив…
  5. Sep 14, 2026🤪 Если бы можно было задать один вопрос про AI в разработке — что бы вы спросили? Как выб…
  6. Sep 13, 2026🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy выра…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →