在编译时获取函数名称?

时间:2013-10-01 19:17:09

标签: c++ unit-testing templates

我想制作一个小而愚蠢的测试框架。

我想在创建这个愚蠢的框架时要满足的一个要求是能够将以“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吗?

1 个答案:

答案 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()

我实际上没有测试过这个。

您可以通过使用函数指针而不是虚函数来简化它,但是您将丢失描述并且可能会遇到与您执行操作的顺序有关的问题。