Обзор существующих систем и библиотек тестирования программного кода для задач спортивного программирования
Авторы: Мельников И. С., Чернышова А. В.
Источник: Мельников, И. С. Обзор существующих систем и библиотек тестирования программного кода для задач спортивного программирования / И. С. Мельников, А. В. Чернышова // Программная инженерия: методы и технологии разработки информационно-вычислительных систем (ПИИВС-2024): сборник научных трудов V Международной научно-практической конференции, Том 2. 27-28 ноября 2024 г. – Донецк, ФГБОУ ВО «Донецкий национальный технический университет», 2024. – С. 74-78.
Аннотация
Мельников И. С., Чернышова А. В. Обзор существующих систем и библиотек тестирования программного кода для задач спортивного программирования. В статье представлен обзор существующих систем для тестирования программного кода для задач спортивного программирования, проведён анализ достоинств и недостатков популярных систем, которые можно использовать для тестирования правильности программного кода в задачах спортивного программирования.
Ключевые слова
Unit-тестирование, Google C++ Testing Framework, NUnit, Stepik, Hacker Earth
Введение
Спортивное программирование — это вид соревнований, в которых участники решают алгоритмические задачи за ограниченное время. Эти задачи часто требуют применения математических и логических навыков, а также умения быстро и эффективно писать код [1].
Существует много библиотек, программных систем для тестирования кода задач спортивного программирования.
В статье будут рассмотрены некоторые библиотеки и программные системы, которые можно использовать для проверки правильности решения задач спортивного программирования, их преимущества и недостатки. На основе выявленных достоинств и недостатков, будут сформулированы требования к авторской программе тестирования программного кода для задач спортивного программирования, а также разработана архитектура будущей программной системы.
Обзор существующих библиотек для тестирования программного кода
Рассмотрим некоторые библиотеки и программные системы, которые можно использовать для тестирования правильности решения задачи (программного кода задачи).
Сначала рассмотрим библиотеки для модульного тестирования (unit-тестирование).
Unit-тестирование или модульное тестирование — это метод тестирования, при котором отдельные модули или компоненты программного обеспечения проверяются на корректность работы. Этот подход позволяет разработчикам выявлять ошибки на ранних этапах разработки, что значительно упрощает процесс отладки [2].
Принцип работы разных библиотек unit-тестирования похож и заключается в использовании классов для тестирования (классы наследуются от стандартного класса библиотеки), прописываются тесты в виде отдельных функций (название функций — название тестов). Внутри каждого теста (функции) выполняются проверки на существование объектов или их равенства. В зависимости от библиотеки могут быть и другие функции. Если проверка успешна, т.е., объекты действительно равняются друг другу, то и тест считается пройденным полностью. Если тест не пройдет, то считается, что есть ошибка в коде, программу необходимо доработать.
Библиотеки для unit-тестирования можно использовать и для проверки правильности решения задачи, при этом тесты уже должны быть написаны, а код метода необходимо реализовать — это и будет решение задачи.
Существует много разнообразных библиотек для Unit-тестирования. А именно: Google Test, Junit, unittest, NUnit и другие. Они похожи по функциональным возможностям, рассмотрим некоторые из них.
Google Test
Google C++ Testing Framework (Google Test) — библиотека для модульного тестирования (англ. unit testing) на языке C++ [3].
Минимальная единица тестирования — это отдельный тест. Для его запуска не требуется предварительная регистрация. Каждый тест, объявленный в программе, запускается автоматически. Тесты могут быть сгруппированы в наборы, полное имя теста формируется из названия группы и его собственного имени.
Разработчики утверждают, что библиотека безопасна для многопоточного использования, однако для одновременного использования утверждений в разных потоках необходимо самостоятельно реализовать примитивы синхронизации.
В библиотеку включён специальный скрипт, который упаковывает исходные файлы в два файла: gtest-all.cc и gtest.h. Эти файлы можно легко интегрировать в проект без дополнительных шагов по предварительной сборке библиотеки.
NUnit
NUnit — открытая среда юнит-тестирования приложений для .NET (C#, VisualBasic, F# и другие) [4].
Рассмотрим пример работы библиотеки.
Создадим класс C# под названием CalcHelper для выполнения двух математический операций: сложение (Add) и умножение (Multiplication). Код такого класса отображён на рисунке 1.
Класс содержит два метода: Add для сложения и Mult для умножения. Каждый метод принимает по два параметра: a — первое число и b — второе число. Метод Add возвращает сумму чисел a и b, метод Mult возвращает произведение чисел a и b.
Нам необходимо проверить правильность выполнения методов сложения и умножения. Для этого нам понадобится библиотека NUnit и отдельный класс, который будет её использовать.
Создаём класс с тестами под названием TestingClass. Чтобы программа понимала, что этот класс для тестирования, необходимо установить атрибут [TestFixture]. Код такого класса отображён на рисунке 2.
Класс содержит 1 поле helper (объект класса CalcHelper) и 3 метода: Setup, AddTwoNumbers, MultTwoNumbers.
Метод Setup позволяет выполнить определённые действия до проверки всех тестов. В нашем случае в методе Setup инициализируется объект класса CalcHelper. Чтобы код смог определить, что Setup это метод инициализации, необходимо установить атрибут [SetUp] для метода.
Метод AddTwoNumbers позволяет проверить правильность выполнения сложения в методе Add объекта helper. Для этого:
- создаются две переменные для двух чисел: a и b, указываются определённые значения для них;
- выполняется получение ответа из метода Add(a, b) в переменную result;
- выполняется проверка соответствия (Assert.Equals) значения переменной result и ожидаемого ответа.
Если result совпадает с ожидаемым ответом, то тест считается пройденным, иначе — ошибка работы метода Add, необходимо доработать.
Для того, чтобы программа понимала, что метод AddTwoNumbers — это метод для тестирования, необходимо установить атрибут [Test] перед ним.
Аналогично работает и метод MultTwoNumbers. Отличие заключается только в том, что проверяется не метод Add объекта helper, а метод Mult объекта helper.
Для запуска unit-тестов необходимо воспользоваться встроенной утилитой для запуска тестов, либо запустить эту же утилиту, но используя IDE - среду для написания и запуска кода.
Достоинства и недостатки библиотек для unit-тестирования
Достоинства библиотек для unit-тестирования:
- позволяют выполнять модульное тестирование написанного кода, проверяется правильность ответов согласно ожидаемым, таким образом, можно проверять и решение задач;
- автоматическое выполнение всех тестов при запуске специальной утилиты;
- отображение времени выполнения, правильности выполнения тестов;
Недостатки библиотек для unit-тестирования:
- можно проводить только модульное тестирование, т.е., тестирование программы по отдельным частям;
- тестировать можно только правильность работы методов, их ответов;
- сложность понимания принципа работы неопытному пользователю, т.е., обычному пользователю сложно будет настроить систему и её запустить.
Обзор программных систем для тестирования задач спортивного программирования
Рассмотрим системы, которые можно использовать для просмотра условия задачи и отправки решения задачи на проверку, проверки правильности этого решения. Обе рассмотренные системы имеют WEB-интерфейс.
Stepik
Stepik — это российская образовательная платформа, предлагающая возможность создания как бесплатных, так и платных открытых онлайн-курсов, и уроков. Система также позволяет решать задачи, тестировать решение задач.
Платформа предоставляет зарегистрированным пользователям инструменты для создания интерактивных обучающих материалов, включая видео, текстовые материалы и разнообразные задания с автоматической проверкой и мгновенной обратной связью. В процессе обучения студенты могут общаться друг с другом и задавать вопросы преподавателям на форумах. Основные дисциплины, охватываемые курсами, включают программирование, математику, биоинформатику, биологию и экономику [5].
Пример интерфейса Stepik представлен на рисунке 3.
Программная система Stepik отлично подходит для решения задач спортивного программирования, содержит определённые достоинства. Но также не лишена и недостатков.
Достоинства:
- возможность создавать свои онлайн-курсы и уроки с задачами;
- возможность изучать материал и решать задачи без преподавателя — автоматическое тестирование решения задачи;
- система является WEB-сайтом, т.е., нет необходимости скачивать и устанавливать программу;
- возможность оставлять комментарии, получать баллы за решённые задачи, видеть рейтинг.
Недостатки:
- нет возможности отправить задачу для проверки преподавателем;
- нет возможности реализовать полученные баллы.
Hacker Earth
Hacker Earth — система для тестирования решения разнообразных задач, предлагаются также задачи для получения работы. Платформа предоставляет разработчикам возможность участвовать в различных конкурсах, тестировать свои навыки и находить работу через проекты и задания, предлагаемые работодателями [6].
Достоинства:
- возможность создать свои задачи;
- возможность решать задачи в автоматическом режиме;
- возможность отправки кода работодателю;
- система является WEB-сайтом.
Недостатки:
- нет возможности обучаться, можно только решать задачи.
Общие преимущества и недостатки рассмотренных библиотек и программных систем тестирования программного кода
Рассмотрев две библиотеки для unit-тестирования и две системы для проверки решения кода, можно выделить общие преимущества и недостатки.
Преимущества:
- автоматическое тестирование, т.е., код запускается и проверяется сам с помощью класса или программы для проверки правильности решения кода;
- рассмотренные библиотеки и системы достаточно популярны, много информации в Интернете;
- лёгкость работы, настройка и использование не создаёт проблем;
- масштабируемость, т.е., есть возможность вносить свои тесты в систему или библиотеку;
- графическое отображение правильности решения и ошибок.
Недостатки:
- есть возможность только автоматического тестирования, кроме HackerEarth, в ней код не проверяют преподаватели, работодатели, а только «робот»;
- рассмотренные системы для тестирования могут тестировать только правильность самого решения, но не учитывают субъективные оценки, например, скорость написания кода, время решения и другие;
- нет возможности реализовать свой успех в решении задач, т.е., задачи можно только решить и получить положительный или отрицательный ответ.
Предложения по возможной модификации системы для тестирования решения задач спортивного программирования
С учётом всех преимуществ и недостатков библиотек и систем, которые можно использовать для проверки правильности решения, предлагается рассмотреть систему для проверки задач спортивного программирования, которая будет использовать принцип системы Stepik, но с некоторыми изменениями:
- система должна предоставлять возможность не только автоматического тестирования кода, но и проверку кода преподавателем/работодателем, например, с помощью telegram;
- система должна предоставлять возможность реализации полученных баллов за успешное решение задач, например, с помощью покупки каких-либо объектов в какой-либо игре;
- система должна учитывать некоторые субъективные оценки, такие как: скорость написания кода, время решения, «заспамленность» и другое.
Выводы
В статье рассмотрены некоторые библиотеки и системы для тестирования решения задач спортивного программирования, изучены достоинства и недостатки этих библиотек и программных систем тестирования программного кода. В рамках статьи был проведён обзор некоторых систем тестирования и библиотек, представлен краткий анализ достоинств и недостатков рассмотренных программных систем и библиотек, которые можно использовать для тестирования программного кода, в том числе и для решения задач спортивного программирования. Сформулированы некоторые предложения по улучшению систем тестирования.
В дальнейшем необходимо провести наиболее подробный анализ существующих программных систем для тестирования задач спортивного программирования на рынке Российской Федерации и в целом, в мире. Планируется провести анализ требований к авторской программной системе для тестирования программного кода в ходе решения задач спортивного программирования. А также планируется разработать возможную архитектуру программной системы с целью дальнейшей программной реализации.
Литература
- 1. Что такое спортивное программирование – URL: https://www.forbes.ru/mneniya/508585-delat-po-kodu-kak-sportivnoe-programmirovanie-stimuliruet-razvitie-tehnologij (дата обращения: 05.11.2024).
- 2. Что такое unit-тестирование – URL: https://blog.skillfactory.ru/glossary/unit-testirovanie/ (дата обращения: 05.11.2024).
- 3. Google Testing Blog: Announcing: New Google C++ Testing Framework. Дата обращения: 16 июля 2009. Архивировано 5 апреля 2009 года.
- 4. Библиотека NUnit – URL: https://nunit.org/ (дата обращения: 05.11.2024).
- 5. Общая информация о Stepik – Справочный центр Stepik. Дата обращения: 29 августа 2019. Архивировано 29 августа 2019 года.
- 6. «Инновационная платформа от разработчиков: HackerEarth». Code-brew. Архивировано с оригинала 15 сентября 2018 года. Проверено 15 сентября 2018 года.