Задача курса

Python: Параметризованные тесты для валидатора имени пользователя

Курс «Python для продвинутых: ООП, типизация и тестирование» · урок «Параметризация тестов через @pytest.mark.parametrize»

Условие

Параметризованные тесты для валидатора имени пользователя

Ты пишешь тесты для функции validate_username, которая проверяет корректность имён пользователей.

Что уже дано

Проверяющая система скрыто определяет функцию validate_username(name: str) -> bool до выполнения твоего кода. Функция возвращает True, если имя удовлетворяет всем правилам, и False иначе. Правила:

  • длина от 3 до 20 символов включительно;
  • допустимы только латинские буквы, цифры и символ подчёркивания _;
  • имя не может начинаться с цифры.

Также скрыто импортирован pytest. Твой код выполняется в том же процессе и пространстве имён.

Что нужно сделать

Напиши одну параметризованную тест-функцию test_validate_username с декоратором @pytest.mark.parametrize.

Функция должна:

  1. Принимать параметры name (строка) и expected (булево значение).
  2. Проверять через assert validate_username(name) == expected.
  3. Покрывать все шесть следующих сценариев одним декоратором @pytest.mark.parametrize:
  • корректное имя из букв и цифр — ожидается True;
  • корректное имя с подчёркиванием — ожидается True;
  • слишком короткое имя (меньше 3 символов) — ожидается False;
  • слишком длинное имя (больше 20 символов) — ожидается False;
  • имя с недопустимым символом (например, дефис или пробел) — ожидается False;
  • имя, начинающееся с цифры — ожидается False.

Не определяй validate_username самостоятельно: она уже создана проверяющей системой.

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно.

Проверяющая система читает верхнеуровневые имена после выполнения твоего кода: она ищет функцию test_validate_username и проверяет, что над ней стоит корректный декоратор @pytest.mark.parametrize с двумя именами параметров и шестью кортежами данных.

Пример использования

names = ["alice", "ab", "bad-name"]
print([validate_username(name) for name in names])

Результат:

[True, False, False]

Попробуйте решить

РешениеPython
Без регистрации · результат не сохраняется