我想制作一个小而愚蠢的测试框架。
我想在创建这个愚蠢的框架时要满足的一个要求是能够将以“TEST_”开头的任何函数添加到我的函数列表中,并为“SETUP_”和“TEARDOWN _”添加一个函数。
例如:
TEST_MyFirstTest("My fake test"){
//... test code
}
SETUP_MyTest("setup before each test"){
//... create all objects to be handled here
}
int main() {
TESTFRAMEWORK Test = new TESTFRAMEWORK();
Test.run();
return 0;
}
显然我会在一个单独的文件中定义我的测试,但有没有办法做到这一点?我需要使用TMP吗?
答案 0 :(得分:1)
如果您愿意将语法调整为:
TEST(MyFirstTest, "My Fake Test") {
// test code...
}
然后你可以这样做:
struct testBase {
virtual void run() = 0;
virtual const char* getDesc() = 0;
};
vector<testBase*> global_test_collection;
#define TEST(name,desc) \
struct test_##name : public testBase { \
virtual void run(); \
virtual const char* getDesc() { return desc; } \
static bool init; \
}; \
test_##name::init = global_test_collection.append(new test_##name()); \
void test_##name::run()
我实际上没有测试过这个。
您可以通过使用函数指针而不是虚函数来简化它,但是您将丢失描述并且可能会遇到与您执行操作的顺序有关的问题。