# Def утро

Елизавета Величко

Один день из жизни тестировщика. Система работает, но в её венах течет отравленный поток. Ночные логи скрывают зловещую тайну, а необработанные исключения выстреливают в темноте, оставляя после себя лишь пустые указатели. Когда стандартные алгоритмы терпят крах, на сцену выходит Охотник - метод, не знающий пощады. Ему предстоит пройти по тонкому льду рекурсии, заглянуть в лицо фатальной ошибке и найти тот самый единственный баг, угрожающий гибелью всему процессу. Цена ошибки - крах ядра. Время работы - до наступления тайм-аута

def утро_понедельника_и_кофе():

кофе = заварить("очень_крепкий", сахар=True, молоко=False)

экран = открыть_ноутбук()

тикет_с_задачей = прочитать("AUT-4471: проверить модуль авторизации")

настроение = "ничего_хорошего_не_жду"

return кофе, экран, тикет_с_задачей, настроение


def проверить_вход_с_правильным_паролем():

пользователь = "администратор_главной_системы"

пароль = "ТрудныйПароль123!"


ответ = система.войти(пользователь, пароль)


if ответ.успешно and ответ.показывает_панель_управления():

написать_в_лог("Нормальный вход работает. Как и должно быть.")

return True

else:

написать_в_лог("Даже нормальный вход сломан. Понедельник.")

return False


def проверить_вход_с_неправильным_паролем():

пользователь = "администратор_главной_системы"

пароль = "явно_неправильный_пароль"


ответ = система.войти(пользователь, пароль)


if not ответ.успешно and ответ.показывает_сообщение_об_ошибке():

написать_в_лог("Неправильный пароль отклонён. Логика жива.")

return True

else:

написать_в_лог("Неправильный пароль пропустили. Мы умрём.")

return False


def проверить_вход_с_пустым_паролем():

"""То, что никто не проверяет, пока не проверяет."""

пользователь = "администратор_главной_системы"

пароль = "" # ничего. пустота. ноль символов.


ответ = система.войти(пользователь, пароль)


if not ответ.успешно:

return True # всё хорошо, пустой пароль не пропустили


# но здесь мы оказались

написать_в_лог("ПУСТОЙ ПАРОЛЬ ПРОПУЩЕН. Я ВШЁЛ В СИСТЕМУ БЕЗ ПАРОЛЯ.")

написать_в_лог("Разработчик не добавил проверку на пустую строку.")

написать_в_лог("Фронтенд показывает звёздочки, а бэкенду всё равно.")

зарегистрировать_баг(

критичность="КРИТИЧЕСКИЙ",

описание="Пустой пароль позволяет войти в систему под любой учётной записью",

шаги_воспроизведения=[

"Открыть страницу входа",

"Ввести логин администратора",

"Оставить поле пароля пустым",

"Нажать 'Войти'",

"Оказаться внутри"

],

ожидаемый_результат="Система должна сказать: введите пароль",

фактический_результат="Система говорит: добро пожаловать",

настроение_тестировщика="мрачное_удовлетворение"

)

return False


def проверить_права_доступа_гостя():

"""Фронтенд говорит 'нельзя'. Но фронтенд - это маска."""

гость = система.войти("гость_из_интернета", "guest")


кнопка_редактировать = гость.найти_на_экране("кнопка_сохранить_документ")


if кнопка_редактировать.видна:

написать_в_лог("Кнопка не показана гостю. Хорошо.")

else:

написать_в_лог("Кнопка скрыта. Но скрыта ли возможность?")


# теперь обходим фронтенд - шлём запрос напрямую

ответ_напрямую = гость.отправить_запрос_в_обход_интерфейса(

метод="POST",

путь="/api/документы/важный_отчёт",

данные="ВНИМАНИЕ: ЭТО ТЕСТ, НО МОГ БЫТЬ НЕ ТЕСТ"

)


if ответ_напрямую.статус == 403:

написать_в_лог("Сервер отклонил. Защита работает на уровне бэкенда.")

return True


# но здесь мы оказались

написать_в_лог("СЕРВЕР ВЕРНУЛ 200. ДАННЫЕ ЗАПИСАНЫ.")

написать_в_лог("Фронтенд прятал кнопку. Бэкенд ничего не проверял.")

написать_в_лог("Любой человек с Postman может редактировать документы.")

зарегистрировать_баг(

критичность="КРИТИЧЕСКИЙ",

описание="Отсутствует проверка прав на сервере. Гость может менять данные через прямой запрос",

шаги_воспроизведения=[

"Зайти как гость",

"Открыть Postman",

"Отправить POST на /api/документы/важный_отчёт",

"Получить 200 OK"

],

ожидаемый_результат="403 Forbidden",

фактический_результат="200 OK, данные сохранены",

настроение_тестировщика="тревожное"

)

return False


def проверить_поиск_на_инъекции():

"""Всё, что вводит пользователь - это потенциально оружие."""

обычный_запрос = "отчёт за май"

ответ = система.поиск(обыный_запрос)


if ответ.содержит_результаты():

написать_в_лог("Обычный поиск работает. Пока не трогаем.")


зловредный_запрос = "",

"Нажать 'Найти'",

"Увидеть выполнение скрипта на странице"

],

ожидаемый_результат="Тег очищен или экранирован",

фактический_результат="Скрипт выполняется",

настроение_тестировщика="усталое_возмущение"

)

return False


def показать_итоги(список_багов):

print("\n" + "=" * 50)

print(" ОТЧЁТ ТЕСТИРОВАНИЯ - ПОНЕДЕЛЬНИК")

print("=" * 50)


критических = [б for б in список_багов if б.критичность == "КРИТИЧЕСКИЙ"]

высоких = [б for б in список_багов if б.критичность == "ВЫСОКИЙ"]


print(f"\nНайдено багов: {len(список_багов)}")

print(f" Критических: {len(критических)}")

print(f" Высоких: {len(высоких)}")


for номер, баг in enumerate(список_багов, 1):

print(f"\n Баг #{номер}: {баг.описание}")

print(f" Критичность: {баг.критичность}")


print("\n" + "-" * 50)

print(" Реакция разработчика:")

print("-" * 50)

print(' "У меня на машине всё работало"')

print(' "Это не баг, это фича"')

print(' "Кто вообще будет вводить пустой пароль?"')

print(' "Ты слишком придираешься"')

print("-" * 50)


print("\n Мой ответ:")

print(' "Пользователь. Пользователь будет."')

print("=" * 50)


def main():

кофе, экран, тикет, настроение = утро_понедельника_и_кофе()


баги = []


написать_в_лог("Начинаю тестирование модуля авторизации.")

написать_в_лог("Настроение: " + настроение)


if not проверить_вход_с_правильным_паролем():

баги.append("Нормальный вход сломан")


if not проверить_вход_с_неправильным_паролем():

баги.append("Неправильный пароль пропускается")


if not проверить_вход_с_пустым_паролем():

баги.append("Пустой пароль пропускается")


написать_в_лог("\nПерехожу к проверке прав доступа.")


if not проверить_права_доступа_гостя():

баги.append("Нет проверки прав на бэкенде")


написать_в_лог("\nПерехожу к проверке поиска.")


if not проверить_поиск_на_инъекции():

баги.append("XSS в поиске")


написать_в_лог(f"\nТестирование завершено. Нашёл {len(баги)} проблем.")


if len(баги) > 0:

написать_в_лог("Открываю Jira. Пишу баг-репорты. Сижу.")

написать_в_лог("Кофе остыл. Это нормально.")

написать_в_лог("Так всегда.")


показать_итоги(баги)


# завтра будет вторник

# будут новые баги

# я буду здесь

return 0 # без ошибок. только баги.