1

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

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

4

1 回答 1

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

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

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

于 2013-11-10T17:36:28.653 回答