2011-08-09 40 views
0

我如何轉換下面的代碼使用boost單元測試框架:C++使用boost測試

#include <iostream> 
#include <fstream> 

#include "graph.hh" 

int main(int argc, char **argv) { 
    const char* ifile = argv[1]; 

    Graph gp; 
    gp.read_xml(ifile); 

    std::cout << "Checking number of nodes and edges..." << std::endl; 
    int nodes_expected = 16; 
    if(nodes_expected != gp.nodes()) { 
    std::cout << "Test Failed." << std::endl; 
    std::cout << "Expected: " << nodes_expected << std::endl; 
    std::cout << "Result: " << gp.nodes() << std::endl; 
    } 
    int edges_expected = 15; 
    if(edges_expected != gp.edges()) { 
    std::cout << "Test Failed." << std::endl; 
    std::cout << "Expected: " << edges_expected << std::endl; 
    std::cout << "Result: " << gp.edges() << std::endl; 
    } 
    return 0; 
} 

我讀過的(Boost Test)的文件,但它並沒有告訴我如何攝取參數從命令行。否則,我可以使用BOOST_CHECK_EQUAL。

+2

那不是你的測試是專門針對一些特殊的'ifile'?如果是的話,稍後將不需要改變它,你可以硬編碼路徑。 –

+0

測試應該是完全獨立的,這是不再的情況下,如果你需要提供的參數吧。如果您需要使用不同的文件進行測試,請編寫一個方法doTest(字符串文件名)並創建幾個測試用例,用不同的硬編碼參數調用此方法。通過這種方式,您的代碼庫或持續集成工具的其他用戶將能夠運行所有測試,而無需瞭解如何執行此操作的特殊知識。其他任何事情聽起來都不像我的單元測試。 – Philipp

+0

有'ifiles'包含的一般特徵。我試圖創建一個測試套件來測試這些功能。其他測試套件更具體,我有這些硬編碼值。 – Stephen

回答

2
#include <boost/test/included/unit_test.hpp> 
#include <fstream> 
#include "graph.hh" 
using namespace boost::unit_test; 

BOOST_AUTO_TEST_CASE(test_num_of_nodes) 
{ 
    Graph gp; 
    gp.read_xml(framework::master_test_suite().argv[1]); 

    BOOST_MESSAGE("Checking number of nodes and edges..."); 

    BOOST_CHECK_EQUAL(16, gp.nodes()); 
    BOOST_CHECK_EQUAL(15, gp.edges()); 
} 
+0

我相信這就是我一直在尋找,但是,現在我在與升壓和TinyXML的問題。我的read_xml函數使用tinyxml,它似乎在運行一些demo.xml,而不是我傳遞它的文件。 – Stephen

0

我認爲最好的解決方案是將ifile與xxd程序一起嵌入(請查看-include選項),請參閱http://linuxcommand.org/man_pages/xxd1.html

這將會給你一個字符數組,你可以只#包括英寸

+0

ifile?爲什麼包含char-arrays這樣的東西有幫助? –

+0

@phresnel它可以避免在運行時加載文件的問題。這將使測試更加自我包含。 – Lalaland

+0

我明白了;你指的是一個變量名。更好地利用'這style'如果你引用代碼;)(downvote刪除) –

0

在升壓單元測試套件文件,你不創建一個簡單的程序,您所描述的方式。你不寫測試工具,你編寫測試套件,由許多函數構成(每個測試用例一個)。這些函數不會從命令行獲取參數。

你寫的將是一個測試案例的功能:內置對一個模板類

  • 無參函數(無參數)
  • 一元函數(一個參數)
  • (提供模板參數)

所以,你需要從一個單獨的硬編碼文件路徑解析你的參數(將參數寫入第二個文件而不是在命令行上傳遞它們),以及將這些傳遞給一元函數測試用例,或者簡單地放棄並硬編碼到測試套件的文件路徑,每個測試用例(函數)可能包含一個文件。

單元測試套件是這樣設計的,它們可以在標準測試運行器或任意運行器中運行,它們可能會採用自己的命令行參數,並且需要特別小心以支持自定義命令行參數。

測試運行器爲您提供您未來的需要大量的可插拔的靈活性(標準化的試運行,過濾,日誌記錄等),但你必須放棄一些程序般的靈活性到那裏。