Вверх
Назад в библиотекуНазад в библиотеку Назад в библиотеку

Обзор существующих систем и библиотек тестирования программного кода для задач спортивного программирования

Авторы: Мельников И. С., Чернышова А. В.
Источник: Мельников, И. С. Обзор существующих систем и библиотек тестирования программного кода для задач спортивного программирования / И. С. Мельников, А. В. Чернышова // Программная инженерия: методы и технологии разработки информационно-вычислительных систем (ПИИВС-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.

Код класса CalcHelper
Рисунок 1 – Код класса CalcHelper

Класс содержит два метода: Add для сложения и Mult для умножения. Каждый метод принимает по два параметра: a — первое число и b — второе число. Метод Add возвращает сумму чисел a и b, метод Mult возвращает произведение чисел a и b.

Нам необходимо проверить правильность выполнения методов сложения и умножения. Для этого нам понадобится библиотека NUnit и отдельный класс, который будет её использовать.

Создаём класс с тестами под названием TestingClass. Чтобы программа понимала, что этот класс для тестирования, необходимо установить атрибут [TestFixture]. Код такого класса отображён на рисунке 2.

Код класса TestingClass
Рисунок 2 – Код класса TestingClass

Класс содержит 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
Рисунок 3 – Интерфейс системы Stepik

Программная система Stepik отлично подходит для решения задач спортивного программирования, содержит определённые достоинства. Но также не лишена и недостатков.

Достоинства:

  • возможность создавать свои онлайн-курсы и уроки с задачами;
  • возможность изучать материал и решать задачи без преподавателя — автоматическое тестирование решения задачи;
  • система является WEB-сайтом, т.е., нет необходимости скачивать и устанавливать программу;
  • возможность оставлять комментарии, получать баллы за решённые задачи, видеть рейтинг.

Недостатки:

  • нет возможности отправить задачу для проверки преподавателем;
  • нет возможности реализовать полученные баллы.

Hacker Earth

Hacker Earth — система для тестирования решения разнообразных задач, предлагаются также задачи для получения работы. Платформа предоставляет разработчикам возможность участвовать в различных конкурсах, тестировать свои навыки и находить работу через проекты и задания, предлагаемые работодателями [6].

Достоинства:

  • возможность создать свои задачи;
  • возможность решать задачи в автоматическом режиме;
  • возможность отправки кода работодателю;
  • система является WEB-сайтом.

Недостатки:

  • нет возможности обучаться, можно только решать задачи.

Общие преимущества и недостатки рассмотренных библиотек и программных систем тестирования программного кода

Рассмотрев две библиотеки для unit-тестирования и две системы для проверки решения кода, можно выделить общие преимущества и недостатки.

Преимущества:

  • автоматическое тестирование, т.е., код запускается и проверяется сам с помощью класса или программы для проверки правильности решения кода;
  • рассмотренные библиотеки и системы достаточно популярны, много информации в Интернете;
  • лёгкость работы, настройка и использование не создаёт проблем;
  • масштабируемость, т.е., есть возможность вносить свои тесты в систему или библиотеку;
  • графическое отображение правильности решения и ошибок.

Недостатки:

  • есть возможность только автоматического тестирования, кроме HackerEarth, в ней код не проверяют преподаватели, работодатели, а только «робот»;
  • рассмотренные системы для тестирования могут тестировать только правильность самого решения, но не учитывают субъективные оценки, например, скорость написания кода, время решения и другие;
  • нет возможности реализовать свой успех в решении задач, т.е., задачи можно только решить и получить положительный или отрицательный ответ.

Предложения по возможной модификации системы для тестирования решения задач спортивного программирования

С учётом всех преимуществ и недостатков библиотек и систем, которые можно использовать для проверки правильности решения, предлагается рассмотреть систему для проверки задач спортивного программирования, которая будет использовать принцип системы Stepik, но с некоторыми изменениями:

  • система должна предоставлять возможность не только автоматического тестирования кода, но и проверку кода преподавателем/работодателем, например, с помощью telegram;
  • система должна предоставлять возможность реализации полученных баллов за успешное решение задач, например, с помощью покупки каких-либо объектов в какой-либо игре;
  • система должна учитывать некоторые субъективные оценки, такие как: скорость написания кода, время решения, «заспамленность» и другое.

Выводы

В статье рассмотрены некоторые библиотеки и системы для тестирования решения задач спортивного программирования, изучены достоинства и недостатки этих библиотек и программных систем тестирования программного кода. В рамках статьи был проведён обзор некоторых систем тестирования и библиотек, представлен краткий анализ достоинств и недостатков рассмотренных программных систем и библиотек, которые можно использовать для тестирования программного кода, в том числе и для решения задач спортивного программирования. Сформулированы некоторые предложения по улучшению систем тестирования.

В дальнейшем необходимо провести наиболее подробный анализ существующих программных систем для тестирования задач спортивного программирования на рынке Российской Федерации и в целом, в мире. Планируется провести анализ требований к авторской программной системе для тестирования программного кода в ходе решения задач спортивного программирования. А также планируется разработать возможную архитектуру программной системы с целью дальнейшей программной реализации.

Литература

  1. 1. Что такое спортивное программирование – URL: https://www.forbes.ru/mneniya/508585-delat-po-kodu-kak-sportivnoe-programmirovanie-stimuliruet-razvitie-tehnologij (дата обращения: 05.11.2024).
  2. 2. Что такое unit-тестирование – URL: https://blog.skillfactory.ru/glossary/unit-testirovanie/ (дата обращения: 05.11.2024).
  3. 3. Google Testing Blog: Announcing: New Google C++ Testing Framework. Дата обращения: 16 июля 2009. Архивировано 5 апреля 2009 года.
  4. 4. Библиотека NUnit – URL: https://nunit.org/ (дата обращения: 05.11.2024).
  5. 5. Общая информация о Stepik – Справочный центр Stepik. Дата обращения: 29 августа 2019. Архивировано 29 августа 2019 года.
  6. 6. «Инновационная платформа от разработчиков: HackerEarth». Code-brew. Архивировано с оригинала 15 сентября 2018 года. Проверено 15 сентября 2018 года.