TGViewer
Python Portal Python Portal @pythonportal · 50.1K subscribers
Post #5126 9.03K
Совет по чистым тестам в Python:

В большинстве случаев твои тесты должны покрывать:

- все happy path сценарии
- edge/corner/boundary кейсы
- негативные тесты
- проверки на безопасность и некорректные вводы

import uuid
from dataclasses import dataclass
from typing import Optional


@dataclass
class User:
username: str


class InMemoryUserRepository:
def __init__(self):
self._users = []

def add(self, user: User) -> None:
self._users.append(user)

def search(self, query: Optional[str] = None) -> list[User]:
if query is None:
return self._users
else:
return [
user
for user in self._users
if query in user.username
]


# happy path
def test_search_users_without_query_lists_all_users():
user1 = User(username="john@doe.com")
user2 = User(username="marry@doe.com")
repository = InMemoryUserRepository()
repository.add(user1)
repository.add(user2)

assert repository.search() == [user1, user2]


# happy path
def test_search_users_with_email_part_lists_all_matching_users():
user1 = User(username="john@doe.com")
user2 = User(username="bob@example.com")
user3 = User(username="marry@doe.com")
repository = InMemoryUserRepository()
repository.add(user1)
repository.add(user2)
repository.add(user3)

assert repository.search("doe") == [user1, user3]


# edge test case
def test_search_users_with_empty_query_lists_all_users():
user1 = User(username="john@doe.com")
user2 = User(username="marry@doe.com")
repository = InMemoryUserRepository()
repository.add(user1)
repository.add(user2)

assert repository.search("") == [user1, user2]


# negative test case
def test_search_users_with_random_query_lists_zero_users():
user1 = User(username="john@doe.com")
repository = InMemoryUserRepository()
repository.add(user1)

assert repository.search(str(uuid.uuid4())) == []


# security test
def test_search_users_with_sql_injection_has_no_effect():
user1 = User(username="john@doe.com")
repository = InMemoryUserRepository()
repository.add(user1)

repository.search("DELETE FROM USERS;")
assert repository.search() == [user1]


👉 @PythonPortal
  • ❤ 40
  • 👍 3
  • 👀 2
More from @pythonportal
  1. Oct 12, 2026Можно буквально ввести предложение и посмотреть, как Transformer обрабатывает его. Этот ин…
  2. Oct 11, 2026«Graph Theory with Applications» — бесплатный учебник, который даёт всестороннее введение…
  3. Oct 11, 2026Разбор собеседований по проектированию систем, разделённый на 28 глав. Рассматриваются мас…
  4. Oct 11, 2026Вышла долгожданная новая версия Python — 3.15 🐍 В неё вошли 5643 коммита от тысячи разраб…
  5. Oct 10, 2026Сейчас в сфере ИИ есть два карьерных пути: Первый — разработчик, который умеет создавать п…
  6. Oct 10, 2026Скачайте 10 книг по Python БЕСПЛАТНО: 1. Think Python — O’Reilly https://t.co/X7y3pX68IW 2…
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 →