SObjectizer-5.5.24 и so_5_extra-1.2.2
2019.01.10
Выпущена версия 5.5.24 нашего OpenSource проекта SObjectizer. Главное нововведение в этой версии — это экспериментальная поддержка unit-тестирования агентов.
Проверка правильности поведения агентов долгое время была сложным вопросом, ответ на который каждый разработчик был вынужден искать сам. Но начиная с версии 5.5.24 в состав SObjectizer-а включены инструменты, которые позволяют автоматизировать действия по проверке правильности поведения агентов. Эти инструменты делают возможным написание unit-тестов для агентов.
Давайте представим себе, что у нас есть агент Pinger, который должен отослать в начале своей работы сообщение Ping агенту Ponger. И есть агент Ponger, который отвечает на Ping сообщением Pong. Исходный код этих агентов можно увидеть здесь.
Вот так может выглядеть unit-тест для проверки корректности работы агентов Pinger и Ponger (в качестве unit-тест фреймворка используется doctest):
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN #include <doctest/doctest.h> #include <ping_pong/agents.hpp> #include <so_5/experimental/testing.hpp> namespace tests = so_5::experimental::testing; TEST_CASE( "ping_pong" ) { // Создаем экземпляр специального "тестового" SObjectizer Environment. // Сам SObjectizer автоматически стартует в конструкторе этого объекта и // автоматически останавливается в деструкторе. tests::testing_env_t sobj; // Нам нужно создать и зарегистрировать агентов, которых мы хотим протестировать. // Указатели на агентов нам потребуются затем в тестовом сценарии. pinger_t * pinger{}; ponger_t * ponger{}; sobj.environment().introduce_coop([&](so_5::coop_t & coop) { pinger = coop.make_agent< pinger_t >(); ponger = coop.make_agent< ponger_t >(); pinger->set_target( ponger->so_direct_mbox() ); ponger->set_target( pinger->so_direct_mbox() ); }); // Начинаем определять сценарий для нашего теста. // Сценарий будет состоять из двух шагов. // На первом шаге мы ожидаем, что агент Ponger получит и обработает // сообщение Ping. sobj.scenario().define_step("ping") .when(*ponger & tests::reacts_to()); // На втором шаге мы ожидаем, что агент Pinger получит и обработает // ответное сообщение Pong. sobj.scenario().define_step("pong") .when(*pinger & tests::reacts_to ()); // Сценарий определен. Запускаем его в работу и ожидаем, что за 100ms // сценарий будет обработан. sobj.scenario().run_for(std::chrono::milliseconds(100)); // Убеждаемся, что сценарий завершился успешно. // Т.е. все его шаги были выполнены. REQUIRE(tests::completed() == sobj.scenario().result()); }
Более подробную информацию о возможностях по тестированию агентов можно найти в официальном блоге проекта на SourceForge.
Хочется отдельно отметить, что это самая первая версия средств проверки правильности работы агентов. Наверняка можно сделать лучше. Поэтому мы предлагаем вам попробовать новую функциональность и поделиться с нами своими впечатлениями: что понравилось, что не понравилось, может быть чего-то не хватает?
Поделиться своими впечатлениями можно либо на info@stiffstream.com, либо в соответствующих разделах на SourceForge (Discussion или Feature Requests) или же создав issue на GitHub-е.
SObjectizer может быть загружен из секции Files на SourceForge или взят из зеркала на GitHub-е. Кроме того, SObjectizer может быть установлен с помощью vcpkg или Conan.
Также обновился сопутствующий проект so_5_extra: мы перевели его на более свежие версии зависимостей и добавили еще один пример в набор штатных примеров.
so_5_extra может быть загружен из секции Files на SourceForge. Также so_5_extra может быть установлен с помощью vcpkg или Conan.