UniteTest++基本使用方法参考 http://unittest-cpp.sourceforge.net/

但是这篇文档只说明了运行所有测试的办法,return UnitTest::RunAllTests();如果实现的测试较多,总不能每次都运行吧,通过研究源代码发现UniteTest++其实提供了过滤掉不需要测试的办法.先找到类class TestRunner,看看它的实现(部分):
 

  
  1. class TestRunner 
  2. ... 
  3.     template <class Predicate> 
  4.     int RunTestsIf(TestList const& list, char const* suiteName, const Predicate& predicate, int maxTestTimeInMs) const
  5.         Test* curTest = list.GetHead(); 
  6.  
  7.         while (curTest != 0){ 
  8.             if (IsTestInSuite(curTest,suiteName) && predicate(curTest)){ 
  9.                     RunTest(m_result, curTest, maxTestTimeInMs); 
  10.                 } 
  11.  
  12.             curTest = curTest->next; 
  13.         } 
  14.  
  15.         return Finish(); 
  16.     }    
  17.  
  18. ... 
注意函数RunTestsIf,它是一个模板函数,模板类型Predicate,再看看while循环中的if(...)调用,后面有一个predicate(curTest),很明显predicate就是模板参数,这个参数就是UniteTest++为我们提供的过滤机制,它可以是函数,一个类等等.
利用一个类来过滤不需要执行的测试,下面是具体代码:
 

  
  1. class ListFilter  
  2.     char **list; 
  3.     int n; 
  4. public
  5.     ListFilter(char **list_, int count) 
  6.     { 
  7.         list = list_; n = count; 
  8.     } 
  9.  
  10.     //重载括号() 
  11.     bool operator()(const Test* const t) const 
  12.     { 
  13.         for (int i=0;i<n;++i) 
  14.         { 
  15.             //在这里我们值比较测试名称,如果想比较更多的数据,可以查看一下Test类 
  16.             //的m_details成员,它是TestDetails类型,你可以看一下它的成员,这些 
  17.             //成员都可以被当作比较的参量. 
  18.             if (0 == strcmp(t->m_details.testName, list[i])) 
  19.             { 
  20.                 return true;     
  21.             } 
  22.         } 
  23.         return false
  24.     } 
  25. }; 
  26. int RunTheseTests(char ** list, int n)  
  27.     UnitTest::TestReporterStdout reporter; 
  28.     UnitTest::TestRunner runner(reporter); 
  29.     return runner.RunTestsIf(UnitTest::Test::GetTestList(), NULL, ListFilter(list,n), 0); 
  30.  
  31. int RunTheTests(char * testName)  
  32.     UnitTest::TestReporterStdout reporter; 
  33.     UnitTest::TestRunner runner(reporter); 
  34.     return runner.RunTestsIf(UnitTest::Test::GetTestList(), NULL, ListFilter(&testName,1), 0); 
  35.  
  36. TEST(Mytest1) 
  37.     CHECK(false); 
  38.  
  39. TEST(Mytest2) 
  40.     CHECK(false); 
  41.  
  42. TEST(Mytest3) 
  43.     CHECK(false); 
  44.  
  45. int main(intchar const *[]) 
  46.     char* testnamelist[3] =  
  47.     { 
  48.         "Mytest1"
  49.         "Mytest2"
  50.         "Mytest3" 
  51.     }; 
  52.     RunTheseTests(testnamelist, 2);//测试Mytest1和Mytest2 
  53.     RunTheTests("Mytest1");//只测试Mytest1 
  最后再提一下,ListFilter重载括号(),它的调用位置就在predicate(curTest),这个调用就相当于ListFilter(curTest),注意它不是构造,而是函数调用.
  本文的主要目的是为了说明如何更灵活的使用UniteTest++,这里仅是一个简单应用.
本文参考:http://stackoverflow.com/questions/7213284/customizing-unittest.