比特幣源碼解析(3) - 準備知識 - Boost

0x05 Test

Boost中Test模塊是用來給代碼做單元測試的,測試的方法是白盒測試,所以編寫測試必須對待測試的模塊有深度的理解,然後再對正常功能和可能會出現的問題進行測試,測試的實際過程就是給定輸入判定是否和預期的輸出相同,所以Test本質上也是個驗證等式的工具外加了一層包裝。

測試過程中三個主要的工具是BOOST_WARN BOOST_CHECK BOOST_REQUIRE

// example5.cpp
#define BOOST_TEST_MODULE mytest
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(mytest)

BOOST_AUTO_TEST_CASE(test1){
  BOOST_CHECK( true );
}

BOOST_AUTO_TEST_CASE(test2){
  typedef enum {red = 8, blue, green = 1, yellow, black } color;
  color c = green;
  BOOST_WARN(sizeof(green) > sizeof(char));
  BOOST_CHECK(c == 2); // BOOST_CHECK斷言失敗繼續執行
  BOOST_REQUIRE(yellow > red); //BOOST_REQUIRE斷言失敗,測試停止
  BOOST_CHECK(black != 4);
}

BOOST_AUTO_TEST_SUITE_END()

/*
g++ example5.cpp -lboost_unit_test_framework
./a.out
Running 2 test case...
example5.cpp(15): error in "test2": check c == 2 failed
example5.cpp(16): fatal error in "test2": critical check yellow > red failed

*** 2 failures detected in test suite "mytest"
*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

另外,對於浮點數比較,BOOST還提供了BOOST_CHECK_CLOSE_FRACTION(left-value, right-value, tolerance-limit),調用的過程中left-valueright-value的類型要一致,否則會報錯。

TEST中還有一個比較重要的概念是叫做TEST FIXTURE,是指爲測試case開始時設置一個上下文環境,測試結束時清楚環境。具體來說就是定義一個新的對象在對象的構造函數中完成環境設置工作,在對象的析構函數中完成清除工作。具體使用看下面實例。

// example5_2.cpp
#define BOOST_TEST_MODULE mytest
#include <boost/test/included/unit_test.hpp>
#include <iostream>

struct F{
  F(){std::cout << "setup" << '\n';}
  ~F(){std::cout << "teardown" << '\n';}
};

BOOST_AUTO_TEST_SUITE(mytest)
// BOOST_FIXTURE_TEST_SUITE(mytest, F), 也可以直接爲該Suite中所有的Case都配置F上下文

// CASE執行前先調用F(),執行完後調用~F()
BOOST_FIXTURE_TEST_CASE(test1, F){ 
  BOOST_CHECK( true );
}

//test2不受影響
BOOST_AUTO_TEST_CASE(test2){
  typedef enum {red = 8, blue, green = 1, yellow, black } color;
  color c = green;
  BOOST_WARN(sizeof(green) > sizeof(char));
  BOOST_CHECK(c == 2); // BOOST_CHECK斷言失敗繼續執行
  BOOST_REQUIRE(yellow > red); //BOOST_REQUIRE斷言失敗,測試停止
  BOOST_CHECK(black != 4);
}

BOOST_AUTO_TEST_SUITE_END()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

0x06 Program options

在編寫命令行程序時,經常會碰到的一個問題就是參數解析問題,就是說我們在運行程序時給程序附上不同的參數值使得程序能夠完成不同的功能。而boost中的program options就是用來處理命令行傳入的參數的模塊,使得程序更簡潔高效。

// exmaple6.cpp
#include <boost/program_options>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main(int argc, char* argv[]){
  using namespace boost::program_options;
  options_description desc("Command line options");  
  // 定義描述選項: (選項全稱,縮寫), (參數類型->默認值),(描述)
  desc.add_options()
    ("help,h", "print help message")
    ("person,p", value<string>()->default_value("world"), "person name")
    ("file,f", value< vector<string> >(), "input file name");

  variables_map vm;  // 存儲傳入的參數
  store(parse_command_line(argc, argv, desc), vm);  // 根據描述選項解析參數
  notify(vm);

  if(vm.count("help")){
    cout << desc << endl;
    return 0;
  }
  cout << "Hello " << vm["person"].as<string>() << endl;

  if(vm.count("file")){
    vector<string> files(vm["file"].as< vector<string> >());
    cout << "Got " << files.size() << " files." << endl;
  }

  return 0;
}

/*  Ubuntu 16.04 LTS
g++ example6.cpp -lboost_program_options

./a.out
Hello world

./a.out -h
Commad line options:
  -h [ --help ]                print help message
  -p [ --person ] arg (=world) person name
  -f [ --file ] arg            input file name

./a.out -p Splay
Hello Splay

*/ 轉自:http://blog.csdn.net/pure_lady/article/details/77689001

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章