有了断言,我们希望把断言封装到独立的测试用例(testcase)里面。
一个测试用例一般包含特定于自己的前置条件、action,以及对结果的断言。前置条件一般是准备好待测试用的输入数据,对于模板元编程就是定义类型。所谓action在模板元编程中一般是调用元函数,也就是实例化类模板。所以对于模板元编程,一个独立的测试用例,就是能够提供一个能在里面定义类型,实例化类模板,并且对结果类型进行断言的独立作用域。而一个类定义恰好能够满足这些要求。
我们给出一个定义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));
};
如上,一个testcase本质上得是一个合法的类定义,所以测试用例名称需要是一个合法的C++标示符,且后花括号后面需要以一个分号结束。
对于测试用例名称,我们还是希望能够是一个自由字符串,这样限制会少很多。基于此我们使用前面用过的一个小技巧,让编译器自动为类生成一个文件内不重复的类名。TEST
的定义修改如下:
#define TEST(name) struct UNIQUE_NAME(tlp_test_)
这样,TEST
的入参name
就没有再使用,你可以让它是一个字符串,或者其它任何你喜欢的标识符。TLP库中最终定义TEST
的代码比这要示例的要复杂,使用name进行测试用例的注册,所以约束了name必须是一个字符串。
现在可以如下这般自由地定义测试用例的名称了,再也不需要有讨厌的下划线了。
TEST(“operator add on int type”)
{
using num1 = __int(10);
using num2 = __int(2);
ASSERT_EQ(__add(num1, num2), __int(12));
};
网友评论