Как создать тестовую среду при использовании внешнего API C ++? - PullRequest
0 голосов
/ 30 декабря 2011

Я пытаюсь создать тестовую среду для использования внешнего API C ++, чтобы я мог тестировать вещи в автономном режиме без необходимости подключения к реальной службе. По сути, я хочу создать свой собственный поддельный сервис, который будет использоваться в целях тестирования. Однако я хочу иметь возможность легко переключаться между этими двумя средами, не меняя тонны кода. По сути, я хочу как-то использовать внешние классы API C ++ в тестовой среде. Одна проблема, с которой я сталкиваюсь, состоит в том, что, поскольку классы являются частью внешнего API, я не могу их изменить. Я могу обернуть их только в другие классы, которые я создаю. Как я могу справиться с этим, будучи в состоянии создать среду, которая не требует от меня изменения тонны кода каждый раз, когда я хочу переключаться назад и вперед? У меня есть пример кода ниже (соответствующие части, где используется API). Как я могу поместить эти классы ниже в испытательный комплект? Спасибо!

...

SessionOptions sessionOptions;
sessionOptions.setServerHost(d_host.c_str());
sessionOptions.setServerPort(d_port);

Session session(sessionOptions);

if (! session.start())
{
    std::cerr <<"Failed to start session." << std::endl;
    return;
}

if (! session.openService("//blp/mktdata"))
{
    std::cerr <<"Failed to open //blp/mktdata" << std::endl;
    return;
}

...

SubscriptionList subscriptions;

std::set<std::string>::const_iterator cItorSubscriptionStrings(m_SubscriptionStrings.begin());

for ( ; cItorSubscriptionStrings != m_SubscriptionStrings.end(); ++cItorSubscriptionStrings)
{
    subscriptions.add((*cItorSubscriptionStrings).c_str(),
        "LAST_PRICE,BID,ASK,TIME",
        "",
        CorrelationId((char*)(*cItorSubscriptionStrings).c_str()));
}

session.subscribe(subscriptions);

while (true)
{
    Event event = session.nextEvent();
    MessageIterator msgIter(event);

    ...

    while (msgIter.next())
    {
        Message msg = msgIter.message();

        if (event.eventType() == Event::SUBSCRIPTION_DATA)
        {
            if ((msg.hasElement("LAST_PRICE")) || ((msg.hasElement("BID")) && msg.hasElement("ASK")))
            {
                double mid = 0;

                if ((msg.hasElement("BID")) && (msg.hasElement("ASK")))
                {
                    mid = (msg.getElementAsFloat64("BID") + msg.getElementAsFloat64("ASK")) / 2;
                }
                else
                {
                    mid = msg.getElementAsFloat64("LAST_PRICE");
                }

                ...
            }
        }
    }

    ...
}

Ответы [ 2 ]

0 голосов
/ 30 декабря 2011

Вы можете попробовать ввести упрощитель (http://www.natpryce.com/articles/000785.html). Если данный API не поддается тестированию, добавьте новый тонкий интерфейс поверх него.

0 голосов
/ 30 декабря 2011

Одна вещь, которую вы можете сделать, - это использовать интерфейс (то есть файлы заголовков) и предоставить собственную реализацию, по крайней мере, для тех функций, которые вас интересуют. Переключение между обеими версиями сводится к связыванию с разными библиотеками: вашими для тестирования, и их для реальной реализации.

Есть несколько вопросов, которые можно решить, например, сохраняя только открытый интерфейс и изменяя частный интерфейс (в этом случае компиляция должна быть направлена ​​на разные объявления, например, с использованием разных путей поиска для заголовков):

  • часто в заглушенной версии требуется хранить разные данные
  • некоторым объектам может понадобиться создавать частные подобъекты особым образом
  • встроенная функция может вызывать другие функции, которые вы на самом деле не хотите реализовывать
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...