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)
- {
- UnitTest::TestReporterStdout reporter;
- UnitTest::TestRunner runner(reporter);
- return runner.RunTestsIf(UnitTest::Test::GetTestList(), NULL, ListFilter(&testName,1), 0);
- }
- TEST(Mytest1)
- {
- CHECK(false);
- }
- TEST(Mytest2)
- {
- CHECK(false);
- }
- TEST(Mytest3)
- {
- CHECK(false);
- }
- 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.
转载于:https://blog.51cto.com/jetyi/740704