UniteTest++基本使用方法參考 http://unittest-cpp.sourceforge.net/
但是這篇文檔隻說明了運作所有測試的辦法,return UnitTest::RunAllTests();如果實作的測試較多,總不能每次都運作吧,通過研究源代碼發現UniteTest++其實提供了過濾掉不需要測試的辦法.先找到類class TestRunner,看看它的實作(部分):
class TestRunner
{
...
template <class Predicate>
int RunTestsIf(TestList const& list, char const* suiteName, const Predicate& predicate, int maxTestTimeInMs) const{
Test* curTest = list.GetHead();
while (curTest != 0){
if (IsTestInSuite(curTest,suiteName) && predicate(curTest)){
RunTest(m_result, curTest, maxTestTimeInMs);
}
curTest = curTest->next;
}
return Finish();
}
}
注意函數RunTestsIf,它是一個模闆函數,模闆類型Predicate,再看看while循環中的if(...)調用,後面有一個predicate(curTest),很明顯predicate就是模闆參數,這個參數就是UniteTest++為我們提供的過濾機制,它可以是函數,一個類等等.
利用一個類來過濾不需要執行的測試,下面是具體代碼:
class ListFilter
char **list;
int n;
public:
ListFilter(char **list_, int count)
{
list = list_; n = count;
}
//重載括号()
bool operator()(const Test* const t) const
for (int i=0;i<n;++i)
{
//在這裡我們值比較測試名稱,如果想比較更多的資料,可以檢視一下Test類
//的m_details成員,它是TestDetails類型,你可以看一下它的成員,這些
//成員都可以被當作比較的參量.
if (0 == strcmp(t->m_details.testName, list[i]))
{
return true;
}
return false;
};
int RunTheseTests(char ** list, int n)
UnitTest::TestReporterStdout reporter;
UnitTest::TestRunner runner(reporter);
return runner.RunTestsIf(UnitTest::Test::GetTestList(), NULL, ListFilter(list,n), 0);
int RunTheTests(char * testName)
return runner.RunTestsIf(UnitTest::Test::GetTestList(), NULL, ListFilter(&testName,1), 0);
TEST(Mytest1)
CHECK(false);
TEST(Mytest2)
TEST(Mytest3)
int main(int, char const *[])
char* testnamelist[3] =
"Mytest1",
"Mytest2",
"Mytest3"
};
RunTheseTests(testnamelist, 2);//測試Mytest1和Mytest2
RunTheTests("Mytest1");//隻測試Mytest1
最後再提一下,ListFilter重載括号(),它的調用位置就在predicate(curTest),這個調用就相當于ListFilter(curTest),注意它不是構造,而是函數調用.
本文的主要目的是為了說明如何更靈活的使用UniteTest++,這裡僅是一個簡單應用.
本文參考:http://stackoverflow.com/questions/7213284/customizing-unittest.
<a target="_blank" href="http://unittest-cpp.sourceforge.net/UnitTest++.html">UnitTest++ documentation</a>
本文轉自jetyi51CTO部落格,原文連結:http://blog.51cto.com/jetyi/740704 ,如需轉載請自行聯系原作者