2011-12-29 106 views
0

我想創建一個測試環境來使用外部C++ API,這樣我就可以脫機測試,而無需連接到實際的服務。實質上,我想創建我自己的假服務,用於測試目的。但是,我希望能夠輕鬆地在這兩種環境之間進行切換,而無需更改大量代碼。基本上,我希望能夠以某種方式在測試環境中使用外部C++ API類。我遇到的一個問題是,因爲類是外部API的一部分,所以我無法更改它們。我只能將它們包裝在我創建的其他課程中。我怎樣才能處理這個問題,同時能夠創建一個不需要我每次想要來回切換的大量代碼的環境?我在下面有一些示例代碼(使用API​​的相關部分)。我如何將這些類放置在測試工具中?謝謝!如何在使用外部C++ 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"); 
       } 

       ... 
      } 
     } 
    } 

    ... 
} 
+0

是的,它是彭博市場數據饋送C++ API。問題是,一臺擁有彭博訪問權限的個人電腦永遠不可用。所以我想爲自己創建一個測試環境,所以我不必一直等待訪問。 – Andrew 2011-12-29 23:08:51

回答

0

一兩件事你可以做的是使用的接口(即頭文件),並提供自己的實現,至少對那些你所關心的功能。要在兩個版本之間切換,基本上就等於鏈接不同的庫:你的測試,他們的真正的實現。

有幾個問題可以解決,例如,只保留公共接口,而且改變了專用接口(在這種情況下,編譯需要在不同的聲明被引導,例如,使用的標題不同的搜索pathes):

  • 經常廢止版本希望存儲不同的數據
  • 一些對象可能需要構建私有子對象以特定的方式
  • 內聯函數可以調用其他的功能,你真的不想要實現
+0

這是一個好主意,沒有想到這一點。我將爲測試片創建單獨的目錄/源文件。我試圖以一種方式將它們全部網格化在一個公共接口中。 – Andrew 2011-12-29 23:09:37

0

你可以嘗試引入simplicator(HTTP:// WWW。 natpryce.com /articles/000785.html)。如果給定的API不適合測試,則在其上引入一個新的精簡接口。