如何在使用外部C ++ API时创建测试环境?

时间:2011-12-29 22:02:34

标签: c++ api testing

我正在尝试创建一个使用外部C ++ API的测试环境,这样我就可以离线测试,而无需连接到实际服务。从本质上讲,我想创建自己的假服务,用于测试目的。但是,我希望能够轻松地在这两种环境之间进行更改,而无需更改大量代码。基本上,我希望能够以某种方式在测试环境中使用外部C ++ API类。我遇到的一个问题是,由于类是外部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 :(得分:0)

您可以做的一件事是使用接口(即头文件)并提供您自己的实现,至少对于您关心的那些功能。在两个版本之间切换基本上相当于连接不同的库:你的测试,他们的真实实现。

有一些问题可以解决,例如只保留公共接口并更改私有接口(在这种情况下,编译需要针对不同的声明,例如使用标题的不同搜索路径):

  • 通常,存根版本需要存储不同的数据
  • 某些对象可能需要以特定方式构建私有子对象
  • 内联函数可能会调用您不想实现的其他函数

答案 1 :(得分:0)

您可以尝试引入一个简单的(http://www.natpryce.com/articles/000785.html)。如果给定的API不适合测试,那么在它上面引入一个新的瘦接口。