customizing unittest++

customizing unittest++

本文关键字:unittest++ customizing      更新时间:2023-10-16

我问这个问题是希望有人站在我的立场上,有一些想法。可以这么说,是想避免做无谓的重复工作。

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

到目前为止,我已经编写了相当多的测试,并且每次运行测试构建时都执行它们,这当然是意料之中的。我甚至定义了我自己的TestReporter类,它为我提供了关于每个测试的更多信息——它在每个测试的末尾打印了每个测试所花费的时间,并且还具有颜色编码的测试开始和测试结束消息,因此我更容易导航测试输出。

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

unittest++的代码相当简单,我承认如果我盯着它看的话,我可能会弄清楚,但肯定有人已经弄清楚了吗?我试图想出一种方法来连接我的argv[]与Test::GetTestList()。我想用cmdline参数过滤测试列表,并只运行这些测试。

嗯。看起来只是个链表。我想我可以把它毁了……O(m*n)搜索,m=总测试,n=指定测试。好。我一直在回答我自己的问题。Mods:我会张贴一个答案与我的解决方案的实施。希望能节省20分钟。

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

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()

我想我明白了。

我的解决方案是:

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.
    }
}

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