測(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);
};
}