【问题标题】:Obtaining names of functions at compile time?在编译时获取函数名称?
【发布时间】:2013-10-01 19:17:08
【问题描述】:

我想做一个小而笨的测试框架。

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

【问题讨论】:

  • 你看过 CPPUnit 吗?
  • 我正在使用 Boost Unit_Test。这更像是一种练习,而不是我打算专业使用的东西。有点类似于重新实现数据结构作为教学练习。
  • 一些编译器支持__FUNCTION_NAME,这是一个返回包含函数名称的宏。
  • @ThomasMatthews:我认为您的意思是 __func____FUNCTION__ - 从技术上讲,它是一个扩展为包含名称的字符串的宏 - 它与扩展为名称的宏略有不同的实际功能!
  • 它是否需要以 TEST_ 开头,或者您可以稍微调整一下并允许它以 TEST() 开头?例如,不要使用TEST_MyFirstTest("My fake test"),而是使用TEST(MyFirstTest, "My fake test")

标签: c++ unit-testing templates


【解决方案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()

我还没有实际测试过。

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

【讨论】:

  • 我会测试这个,但现在我会接受它。这很漂亮。
  • 好的,我对其进行了调整,效果很好。很棒的东西,非常感谢。
猜你喜欢
  • 2017-04-09
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2010-09-19
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多