簡體   English   中英

在使用外部C ++ API時如何創建測試環境?

[英]How to create a test environment while using an external C++ API?

我試圖創建一個使用外部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");
                }

                ...
            }
        }
    }

    ...
}

您可以做的一件事是使用接口(即頭文件)並至少在您關心的那些功能上提供自己的實現。 在這兩個版本之間切換實際上意味着要鏈接到不同的庫:您的用於測試,它們的用於實際實現。

有一些問題可以解決,例如,僅保留公共接口並更改私有接口(在這種情況下,編譯需要針對不同的聲明,例如,對標頭使用不同的搜索路徑):

  • 存根版本通常想存儲不同的數據
  • 一些對象可能需要以特定方式構造私有子對象
  • 內聯函數可能會調用您實際上不想實現的其他函數

您可以嘗試引入一個簡化器(http://www.natpryce.com/articles/000785.html)。 如果給定的API不適合測試,請在其之上引入一個新的瘦接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM