[boost] : test庫

最小化的測試套件minimal_test

test庫提供一個最小化的測試套件minimal_test, 相似lightweight_test適合入門級測試.
須要包含文件文#include <boost/test/minimal_test.hpp>
minimal_test內部實現了main(), 所以無需本身編寫main()函數, 只要實現test_main()便可, 它是minimal_test的真正功能函數. 注意test_main()必須返回一個整數.
minimal_test提供四個測試斷言宏ios

BOOST_CHECK(e) 斷言測試經過, 如不經過不影響程序執行
BOOST_REQUIRE(e) 要求斷言必須經過, 不然程序中止執行
BOOST_ERROR(e1, e2) 給出錯誤信息, 程序繼續執行
BOOST_FAIL(e1, e2) 給出錯誤信息, 程序運行中止
// Copyright (c) 2015
// Author: Chrono Law
#include <iostream>
using namespace std;

#include <boost/format.hpp>
#include <boost/test/minimal.hpp> // 最小化測試頭文件

int test_main( int argc, char* argv[] )
{
    using namespace boost;
    format fmt("%d-%d");

    BOOST_CHECK(fmt.size() != 0); // 斷言測試經過, 如不經過不影響程序執行
    fmt % 12 % 34;
    BOOST_REQUIRE(fmt.str() == "12-34"); // 要求斷言必須經過, 不然程序中止執行

    BOOST_ERROR("演示一條錯誤消息"); // 給出錯誤信息, 程序繼續執行

    fmt.clear();
    fmt % 12;
    try
    {
        std::cout << fmt; // 輸入參數不完整, 拋出異常
    }
    catch (...)
    {
        BOOST_FAIL("致命錯誤,測試終止"); // 給出錯誤信息, 程序運行中止
    }
    return 0; // 必須返回值
}

運行輸出c++

minimal_test.cpp(18): 演示一條錯誤消息 in function: 'int test_main(int, char**)'
minimal_test.cpp(28): 致命錯誤,測試終止 in function: 'int test_main(int, char**)'

minimal_test與lightweight_test區別:框架

  • 測試斷言有CHECK/REQUIRE/ERROR/FAIL級別
  • 不支持捕獲異常的測試
  • 必須實現test_main()函數做爲測試入口
  • 自動輸出測試報告

單元測試框架UTF

Boost test庫提供了一個用於單元測試的基於命令行界面的測試套件UTF: Unit Test Framework,具備單元測試、檢測內存泄露、監控程序運行的功能。函數

UTF測試斷言

UTF中的測試斷言:BOOST_LEVEL_ITEM單元測試

LEVEL WARN 警告級,不增長錯誤數量,不影響程序運行
CHECK 檢查級別,增長錯誤數量,不影響程序運行
REQUIRE 最高級別,增長錯誤數量,程序終止運行
ITEM EQUAL/CLOSE 測試相等性
GE/GT/LT/LE/NE 測試不等性
(NO_)THROW 是否拋出異常
MESSAGE 測試信息

測試用例與測試套件

test庫將測試程序定義爲一個測試模塊,由測試安裝,測試主體,測試清理和測試運行器四個部分組成。測試主體是測試模塊的實際運行部分,由測試用例和測試套件組織成測試樹的形式。
測試用例是一個包含多個測試斷言的函數, 是能夠被獨立執行測試的最小單元, 各個測試用例之間是無關的, 發生的錯誤不會影響其餘測試用例.
測試套件是測試用例的容器,能夠嵌套,包含一個或多個測試用例,將多個測試用例分組管理,共享安裝/清理代碼, 更好的組織測試用例。
主測試套件, 任何UTF單元測試程序必須存在惟一一個主測試套件, 它是整個測試樹的根節點, 其餘測試套件都是它的子節點. 主測試套件的定義可使用宏BOOST_TEST_MAIN或者
BOOST_TEST_MODULE, 它們必須出如今<boost/test/unit_test.hpp>以前.測試

// Copyright (c) 2015
// Author: Chrono Law
//#define BOOST_TEST_MAIN
#define BOOST_TEST_MODULE // 主測試套件
#include <boost/test/unit_test.hpp> // test庫頭文件

#include <boost/smart_ptr.hpp>
using namespace boost;


BOOST_AUTO_TEST_SUITE(s_smart_ptr) // 測試套件開始

BOOST_AUTO_TEST_CASE(t_scoped_ptr) // 測試用例1
{
    scoped_ptr<int> p(new int(874));
    BOOST_CHECK(p);
    BOOST_CHECK_EQUAL(*p , 874);

    p.reset();
    BOOST_CHECK(p == 0);
}

BOOST_AUTO_TEST_CASE(t_shared_ptr) // 測試用例2
{
    shared_ptr<int> p(new int(100));

    BOOST_CHECK(p);
    BOOST_CHECK_EQUAL(*p , 100);
    BOOST_CHECK_EQUAL(p.use_count(), 1);

    shared_ptr<int> p2 = p;
    BOOST_CHECK_EQUAL(p, p2);
    BOOST_CHECK_EQUAL(p2.use_count(), 2);

    *p2 = 255;
    BOOST_CHECK_EQUAL(*p, 255);
    BOOST_CHECK_GT(*p, 200);
}

BOOST_AUTO_TEST_SUITE_END() // 測試套件結束

輸出結果ui

Running 2 test cases...

*** No errors detected

測試夾具: 測試安裝和測試清理比如c++中的構造函數和析構函數,「測試夾具」實現了自動的測試安裝和測試清理。基本形式爲:spa

struct test_fixture_name  // 測試夾具類, 一般是struct, 將被UTF繼承
{
  test_fixture_name(){}   // 測試安裝工做
  ~test_fixture_name(){}  // 測試清理工做
};

測試夾具類須要使用如下兩個宏指定測試用例和測試套件命令行

#define BOOST_FIXTURE_TEST_SUITE(suite_name, F)
#define BOOST_FIXTURE_TEST_CASE(test_name, F)
// Copyright (c) 2015
// Author: Chrono Law
#include <iostream>
#include <vector>
using namespace std;

#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
#include <boost/assign.hpp>
using namespace boost;

struct global_fixture // 全局測試夾具類
{
    global_fixture(){cout << ("global setup\n");}
    ~global_fixture(){cout << ("global teardown\n");}
};

// 該宏定義的夾具類被應用於整個測試用例的全部測試套件, 包括主測試套件
BOOST_GLOBAL_FIXTURE(global_fixture);

struct assign_fixture // 測試套件夾具類
{
    assign_fixture()
    {cout << ("suit setup\n");}
    ~assign_fixture()
    {cout << ("suit teardown\n");}

    vector<int> v;    // 全部測試用例均可以用的成員變量
};

// 定義測試套件級別的夾具
BOOST_FIXTURE_TEST_SUITE(s_assign, assign_fixture)

BOOST_AUTO_TEST_CASE(t_assign1) // 測試用例1, 測試+=操做符
{
    using namespace boost::assign;

    v += 1,2,3,4;
    BOOST_CHECK_EQUAL(v.size(), 4);
    BOOST_CHECK_EQUAL(v[2], 3);
}

BOOST_AUTO_TEST_CASE(t_assign2) // 測試用例2, 測試push_back函數
{
    using namespace boost::assign;

    push_back(v)(10)(20)(30);

    BOOST_CHECK_EQUAL(v.empty(), false);
    BOOST_CHECK_LT(v[0], v[1]);
}

BOOST_AUTO_TEST_SUITE_END() // 測試套件結束

輸出結果爲:code

global setup
Running 2 test cases...
suit setup
suit teardown
suit setup
suit teardown
global teardown

*** No errors detected
相關文章
相關標籤/搜索