[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提供四個測試斷言宏

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; // 必須返回值
}

運行輸出

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() // 測試套件結束

輸出結果

Running 2 test cases...

*** No errors detected

測試夾具: 測試安裝和測試清理好比c++中的構造函數和析構函數,“測試夾具”實現了自動的測試安裝和測試清理。基本形式為:

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() // 測試套件結束

輸出結果為:

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

*** No errors detected


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM