C++11 模板元編程 - 測(cè)試套件


測(cè)試套件Fixture用于對(duì)對(duì)測(cè)試用例分組。一個(gè)fixture中的所有測(cè)試用例共享了相同的腳手架,包含共同使用的前置數(shù)據(jù),輔助函數(shù)定義等等。映射到模板元編程,fixture應(yīng)該是一個(gè)可以定義類型,定義元函數(shù)的獨(dú)立作用域。

首先想到也用類定義來實(shí)現(xiàn)fixture,這樣內(nèi)部的testcase就相當(dāng)于fixture類的內(nèi)嵌類。那么我們定義可以實(shí)現(xiàn)fixture的輔助宏如下:


#define FIXTURE(name) class tlp_fixture_##name

這樣我們就可以如下定義Fixture了:

FIXTURE(TestIntTypeAlgo)
{
    using num1 = __int(10);
    using num2 = __int(2);

    TEST("operator add on int type")
    {
        ASSERT_EQ(__add(num1, num2), __int(12));
    };

    TEST("operator sub on int type")
    {
        ASSERT_EQ(__sub(num1, num2), __int(8));
    };
};

這樣看起來似乎一切OK了,而且我們用了class關(guān)鍵字,這樣fixture類內(nèi)部定義的所有東西默認(rèn)都是private的,外部不可見。

遺憾的是,上述方案有個(gè)致命問題。因?yàn)闃?biāo)準(zhǔn)規(guī)定類的內(nèi)部不能定義模板的特化,也就是說上述fixture的實(shí)現(xiàn)導(dǎo)致fixture內(nèi)部無法定義需要模式匹配的元函數(shù)。

于是我們退而求其次,用namespace來做fixture的實(shí)現(xiàn):

// "tlp/test/details/Fixture.h"

#define FIXTURE(name) namespace tlp_fixture_##name

實(shí)際TLP中FIXTURE宏的實(shí)現(xiàn)還包含測(cè)試套件注冊(cè)的代碼,所以比這里的示例代碼要復(fù)雜一些。無論如何現(xiàn)在的fixture內(nèi)部就可以定義各種供測(cè)試用例使用的臨時(shí)元函數(shù)了。

FIXTURE(TestMetaFunctionInFixture)
{
    template<typename T, typename U>
    using LargerType = __if(__bool(sizeof(T) > sizeof(U)), T, U);

    struct TwoBytesType { char dummy[2]; };

    TEST("int should be larger than two bytes")
    {
        ASSERT_EQ(LargerType<int, TwoBytesType>::Result, int);
    };

    TEST("char should be smaller than two bytes")
    {
        ASSERT_EQ(LargerType<char, TwoBytesType>::Result, TwoBytesType);
    };
}

測(cè)試Setup

返回 C++11模板元編程 - 目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容