有了斷言徙歼,我們希望把斷言封裝到獨(dú)立的測(cè)試用例(testcase)里面茵汰。
一個(gè)測(cè)試用例一般包含特定于自己的前置條件、action,以及對(duì)結(jié)果的斷言引谜。前置條件一般是準(zhǔn)備好待測(cè)試用的輸入數(shù)據(jù)锨推,對(duì)于模板元編程就是定義類型距辆。所謂action在模板元編程中一般是調(diào)用元函數(shù)芜果,也就是實(shí)例化類模板。所以對(duì)于模板元編程玉雾,一個(gè)獨(dú)立的測(cè)試用例翔试,就是能夠提供一個(gè)能在里面定義類型,實(shí)例化類模板复旬,并且對(duì)結(jié)果類型進(jìn)行斷言的獨(dú)立作用域垦缅。而一個(gè)類定義恰好能夠滿足這些要求。
我們給出一個(gè)定義testcase的輔助宏定義如下:
#define TEST(name) struct tlp_test_##name
這樣我們就可以這樣定義testcase了:
TEST(operator_add_on_int_type)
{
using num1 = __int(5);
using num2 = __int(6);
ASSERT_EQ(__add(num1, num2), __int(11));
};
如上驹碍,一個(gè)testcase本質(zhì)上得是一個(gè)合法的類定義壁涎,所以測(cè)試用例名稱需要是一個(gè)合法的C++標(biāo)示符凡恍,且后花括號(hào)后面需要以一個(gè)分號(hào)結(jié)束。
對(duì)于測(cè)試用例名稱怔球,我們還是希望能夠是一個(gè)自由字符串嚼酝,這樣限制會(huì)少很多【固常基于此我們使用前面用過(guò)的一個(gè)小技巧闽巩,讓編譯器自動(dòng)為類生成一個(gè)文件內(nèi)不重復(fù)的類名。TEST
的定義修改如下:
#define TEST(name) struct UNIQUE_NAME(tlp_test_)
這樣担汤,TEST
的入?yún)?code>name就沒(méi)有再使用涎跨,你可以讓它是一個(gè)字符串,或者其它任何你喜歡的標(biāo)識(shí)符崭歧。TLP庫(kù)中最終定義TEST
的代碼比這要示例的要復(fù)雜隅很,使用name進(jìn)行測(cè)試用例的注冊(cè),所以約束了name必須是一個(gè)字符串率碾。
現(xiàn)在可以如下這般自由地定義測(cè)試用例的名稱了外构,再也不需要有討厭的下劃線了。
TEST(“operator add on int type”)
{
using num1 = __int(10);
using num2 = __int(2);
ASSERT_EQ(__add(num1, num2), __int(12));
};