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.