天天看點

UniteTest++運作指定的測試實作

 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 ,如需轉載請自行聯系原作者

繼續閱讀