首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义unittest++

自定义unittest++
EN

Stack Overflow用户
提问于 2011-08-27 16:02:55
回答 1查看 639关注 0票数 1

我满怀希望地问这个问题,希望有人已经站在我的立场上,有了一些想法。可以这么说,试图避免重复发明轮子。

我使用的是UnitTest++:http://unittest-cpp.sourceforge.net/UnitTest++.html

到目前为止,我已经编写了相当多的测试,每次我运行测试构建时,它们都会执行,这当然是意料之中的。我甚至定义了自己的TestReporter类,它为我提供了比缺省值更多的关于每个测试的信息--它在测试结束时打印每个测试所花费的时间,并且还具有用颜色编码的测试开始和测试结束消息,这样我就可以更容易地浏览测试输出。

但是我已经达到了这样一个地步:大量的测试输出了如此之多的输出,以至于我的控制台的缓冲区甚至不再保存前几个测试的结果,我厌倦了更改这个设置。因此,我希望能够将运行测试的参数指定为可选参数,构建我想运行的测试,并跳过其他测试。

UnitTest++的代码相当简单,我承认如果我再仔细研究一下,我可能就能弄明白,但肯定有人已经弄明白了吧?我正在尝试想出一种方法来连接我的argv[]和Test::GetTestList()。我想用cmdline参数过滤测试列表,只运行那些测试。

嗯。看起来它只是一个链表。我想我可以直接去毁掉它。O(m*n)搜索,m=total测试,n=specified测试。井。我一直在回答我自己的问题。Mods:我将在我的解决方案的实现中发布一个答案。希望这能为某人节省20分钟。

编辑:看起来我真的应该使用谓词:

代码语言:javascript
复制
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()了。

编辑:我想我弄明白了。哇,第一次尝试模板编程。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-27 17:08:13

这是我的解决方案:

代码语言:javascript
复制
namespace UnitTest {
    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) {
                std::string dot_cpp_appended = std::string(list[i]) + ".cpp";
                if (!strcasecmp(t->m_details.testName, list[i]) ||
                        !strcasecmp(t->m_details.suiteName, list[i]) ||
                        !strcasecmp(t->m_details.filename, list[i]) ||
                        !strcasecmp(t->m_details.filename, dot_cpp_appended.c_str())) {
                    // erring on the side of matching more tests
                    return true;
                }
            }
            return false;
        }
    };

    int RunTheseTests(char ** list, int n) {
        TestReporterStdout reporter;
        TestRunner runner(reporter);
        return runner.RunTestsIf(Test::GetTestList(), NULL, ListFilter(list,n), 0);
    }
}

int main(int argc, char *argv[]) {
    if (argc == 1) {
        UnitTest::RunAllTests();
    } else {
        UnitTest::RunTheseTests(argv+1, argc-1); // skip the program's name itself.
    }
}

唯一让我有点困扰的是,没有一种干净的方法来检查是否有任何给定的测试匹配器最终没有匹配任何东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7213284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档