Введение 4
Постановка задач 6
1. Обзор предметной области 7
1.1. Вывод типов 10
1.1.1 Mypy 10
1.1.2 Pyright 10
1.1.3 Pyre 11
1.1.4 pytype 11
1.1.5 PyCharm 12
1.1.6 PYInfer и Type4Py 13
1.2. Генерация тестов 14
1.2.1 Pynguin 14
1.2.2 Auger 14
1.2.3 Atheris 14
1.2.4 Automated Support for Unit Test Generation 15
1.3. Сравнение существующих решений 16
1.3.1 Вывод типов 16
1.3.2 Генерация тестов 17
2. Презентация решения 19
2.1. Подготовка запроса 19
2.2. Вывод типов 20
2.3. Фаззинг 20
2.4. Исполнение кода 20
2.5. Генерация кода тестов 21
3. Детали реализации 22
3.1. Пользовательский интерфейс 22
3.2. Вывод типов 24
3.2.1 Анализ кода 24
3.2.2 Уточнение типов 24
3.3. Генерация значений 26
3.3.1 Управление процессом фаззинга 29
3.4. Исполнение кода 30
3.4.1 Механизм исполнения 31
3.4.2 Сериализация данных 32
3.5. Генерация кода тестов 35
3.5.1 Сравнения объектов 35
4. Заключительный раздел с основными результатами 37
4.1. Результаты 37
4.2. Примеры применения проекта 41
4.2.1 Функция без аннотаций с условиями 41
4.2.2 Протокол 43
4.2.3 Функция с аннотациями 44
4.2.4 Метод класса 46
4.3. Развитие проекта 49
Выводы 50
Заключение 51
Список литературы 52
Тестирование программного обеспечения является не менее важной задачей, чем написание исходного кода проекта, так как позволяет проверить корректность работы созданного продукта и обнаружить проблемы до перехода в массовое использование. Кроме этого модульные тесты могут применяться при регрессионном тестировании для обнаружения ошибок в уже протестированных участках исходного кода после его изменения разработчиками. Также наличие модульных тестов может стать значимым дополнением к документации, так как тесты могут показать способы применения той или иной функциональности, это может помочь как новым разработчиками в команде, так и внешним пользователям исходного кода. Важным преимуществом модульных тестов является то, что любой разработчик сможет запустить без использования специального окружения, а за счет этого время исполнения будет значительно меньше, чем интеграционных и системных тестов.
Процесс написания модульных тестов занимает достаточно большое количество времени, часто объем кода тестов больше объема тестируемого кода, поэтому в различных случаях проекты могут не содержать модульные тесты.
Для одного из самых популярных языков программирования Python[1, 2, 3] проблема отсутствия тестов становится еще более актуальной, так как он часто используется начинающими программистами, аналитиками данных и учеными, которые могут не иметь большого опыта в разработке программного обеспечения и допускать много ошибок.
Помочь решить проблему нехватки или отсутствия модульных тестов может стать система, способная автоматически генерировать модульные тесты для существующего кода, с помощью которых можно будет выявлять возможные места ошибок или использовать для регрессионного тестирования.
В данной работе изучаются существующие технологии связанные с автоматической генерацией модульных тестов для языка программирования Python и представляется решение в виде программной системы, поддерживающей полный цикл создания тестов, в том числе в виде расширения для популярной интегрированной среды разработки IntelliJ IDEA[5].
Структура работы. В разделе 1 осуществлен разбор предметной области и альтернативных решений данной проблемы. В разделе 2 представлена реализованная программная система. В разделе 3 рассказывается о технических деталях ее реализации. В разделе 4.1 представлена сводная статистика возможностей данного инструмента. В разделе 4.2 представлены примеры модульных тестов, созданных с помощью реализованной программной системы.
В работе рассматривается актуальная проблема автоматизации процесса создания модульных тестов в контексте языка программирования Python. Был проведен анализ существующих решений в данной области, а также инструментов, связанных с выводом типов, которые могли быть использованы для ускорения алгоритмов. Был разработан и полностью реализован алгоритм автоматической генерации модульных тестов на языке Python, основанный на механизме фаззинга и использующий эвристический алгоритм вывода типов для ускорения процесса. Разработанный инструмент показывает лучшие результаты в данной области.