Задача 1. Валидатор пароля
Функция:
def validate_password(password: str) -> bool:
...
Требования
Пароль считается валидным, если:
- минимум 8 символов;
- есть хотя бы одна цифра;
- есть хотя бы одна заглавная буква;
- есть хотя бы одна строчная буква;
- нет пробелов.
Что нужно сделать
Написать полный набор тестов.
Подумать над кейсами
Password123 -> True
password123 -> False
PASSWORD123 -> False
Password -> False
Pass 123 -> False
P1a -> False
⸻
Задача 2. Банковский перевод
Функция:
def transfer(balance, amount):
...
Требования
- нельзя перевести отрицательную сумму;
- нельзя перевести больше баланса;
- баланс не может стать отрицательным;
- при успешном переводе вернуть новый баланс.
Примеры
transfer(1000, 500) # 500
transfer(1000, 0) # ?
transfer(1000, -10) # Exception
transfer(1000, 2000) # Exception
Задача
Определить все тест-кейсы самостоятельно.
⸻
Задача 3. Поиск пользователя
Функция:
def find_user(users, email):
...
Вход
users = [
{"email": "a@test.com"},
{"email": "b@test.com"},
]
Требования
- вернуть пользователя;
- вернуть None, если пользователь не найден.
Интересные кейсы
- пустой список;
- email в другом регистре;
- None вместо email;
- несколько одинаковых email;
- список из 10000 пользователей.
⸻
Задача 4. Корзина интернет-магазина
Функция:
def calculate_total(items):
...
Вход
[
{"price": 100, "quantity": 2},
{"price": 50, "quantity": 3},
]
Требования
Сумма = цена × количество.
Нужно протестировать
- пустую корзину;
- отрицательную цену;
- количество 0;
- дробные цены;
- большие значения;
- отсутствие поля price;
- отсутствие поля quantity.
⸻
Задача 5. Ограничение попыток входа
Класс:
class LoginManager:
...
Логика
После 3 неудачных попыток аккаунт блокируется.
Написать тесты
Проверить:
- успешный вход;
- 1 ошибка;
- 2 ошибки;
- 3 ошибки;
- вход после блокировки;
- успешный вход между ошибками;
- сброс счётчика.
⸻
Задача 6. Кэширование
Функция:
@cache
def get_user(user_id):
...
Требования
Если пользователь уже запрашивался, база данных не должна вызываться повторно.
Нужно проверить
- первый вызов;
- повторный вызов;
- разные id;
- очистку кэша.
Для этого придётся использовать mock.
⸻
Задача 7. API клиента
Функция:
def get_weather(city):
...
Внутри делает HTTP-запрос.
Нужно протестировать
- код ответа 200;
- код ответа 404;
- код ответа 500;
- таймаут;
- пустой ответ;
- битый JSON.
Использовать:
from unittest.mock import patch
или
pytest-mock
⸻
Задача 8. Декоратор логирования
Есть декоратор:
@log_calls
def calculate():
...
Он должен писать в лог:
Function calculate called
Проверить
- лог появляется;
- лог содержит имя функции;
- лог пишется при исключении;
- несколько вызовов подряд.
⸻
Задача 9. Система скидок
Функция:
def get_discount(user_type, amount):
...
Правила
regular -> 0%
premium -> 10%
vip -> 20%
если сумма > 10000:
+5%
Написать тесты
Используя параметризацию pytest.
⸻
Задача 10. Тестирование класса
class Stack:
def push(self, item):
...
def pop(self):
...
def size(self):
...
Проверить
- добавление элемента;
- несколько элементов;
- извлечение элементов;
- порядок LIFO;
- размер стека;
- извлечение из пустого стека;
- большое количество элементов.
⸻
Если хочешь задачи уровня “как дают на реальном проекте Python QA Automation”, то дальше идут:
- mock и patch;
- pytest fixtures;
- тестирование REST API;
- тестирование БД;
- тестирование очередей (RabbitMQ/Kafka);
- тестирование асинхронного кода (asyncio);
- Page Object Model для Selenium/Playwright.