1. Основы unit-тестирования логических функций в Python
Основы unit-тестирования логических функций в Python
Добро пожаловать на курс «Разработка и тестирование функций валидации промптов». Это первая статья нашего цикла, и мы начнем с фундамента — тестирования логики. В мире разработки приложений на базе LLM (Large Language Models) любая ошибка в валидации входных данных может стоить дорого: от утечки контекста до полной неработоспособности сервиса.
Сегодня мы разберем, как гарантировать, что ваши функции проверки промптов работают именно так, как задумано.
Зачем нужно unit-тестирование?
Unit-тестирование (или модульное тестирование) — это процесс проверки отдельных, самых мелких частей программы (модулей или функций) в изоляции от остального кода. Представьте, что вы строите дом. Прежде чем класть стену, вы проверяете каждый кирпич на прочность. Unit-тест — это и есть проверка каждого «кирпича» вашего кода.
!Принципиальная схема работы модульного теста: сравнение ожидания и реальности.
В контексте нашей задачи, валидация промпта — это барьер, который пропускает только корректные запросы. Если барьер сломан, приложение становится уязвимым.
Логические функции и булева алгебра
Функция валидации, такая как is_system_prompt(prompt: str) -> bool, является классическим предикатом. В математике и программировании предикат — это функция, которая возвращает истину или ложь.
Формально мы можем записать это так:
где — это наша функция валидации, — входной промпт (строка), соответствует значению True (истина), а — значению False (ложь).
Наша цель — убедиться, что для любого функция возвращает верное значение из этого множества.
Инструментарий: Модуль unittest
В языке Python стандартом де-факто для тестирования является встроенная библиотека unittest. Она позволяет создавать классы-тестеры, которые содержат наборы проверок.
Основные компоненты unittest:
assertTrue, assertFalse, assertEqual).Практическая задача: Тестирование is_system_prompt
Перейдем к вашему конкретному кейсу. У нас есть гипотетическая функция is_system_prompt, которая должна проверить, совпадает ли переданный текст с эталонным системным промптом. Это критически важно для безопасности, чтобы пользователь не мог подменить инструкции нейросети.
Допустим, логика нашей функции выглядит так (в реальном приложении эталонная строка должна храниться в защищенных переменных окружения, но для примера мы определим её в коде):
Теперь нам нужно написать тесты, которые покроют как позитивные, так и негативные сценарии.
Структура теста
Создадим файл test_logic.py. В нем мы импортируем модуль unittest и нашу функцию.
Тест-кейс 1: Позитивный сценарий (True)
Это самый важный тест. Он проверяет, что функция возвращает True, когда промпт действительно совпадает с эталоном.
> Важно: В unit-тестировании мы всегда тестируем ожидаемое поведение относительно спецификации. Если спецификация меняется, тесты должны быть обновлены.
В этом коде мы используем метод self.assertTrue(x). Математически это проверка условия:
где — результат выполнения функции, а — знак тождественного равенства.
Тест-кейс 2: Негативные сценарии (False)
Хороший тестировщик всегда думает: «А как это можно сломать?». Нам нужно проверить случаи, когда функция обязана вернуть False.
Вот список необходимых проверок для вашей задачи:
.strip(), это может быть ошибкой.Реализуем эти проверки:
Здесь мы используем self.assertFalse(x), что эквивалентно:
где — результат выполнения функции.
Запуск тестов
Чтобы запустить эти тесты, достаточно выполнить команду в терминале:
Если все написано верно, вы увидите вывод, похожий на этот:
Точки .. означают, что два теста (функции, начинающиеся с test_) прошли успешно.
Резюме
Мы рассмотрели основы создания unit-тестов для логических функций валидации.
Ключевые выводы:
unittest позволяет автоматизировать этот процесс и избежать регрессии (появления старых ошибок в новом коде).В следующей статье мы углубимся в тему и рассмотрим, как тестировать более сложные валидаторы, использующие регулярные выражения и нечеткое сравнение строк.