Boost.Test使用正则表达式测试文件内容

时间:2016-02-17 14:28:51

标签: c++ boost-regex boost-test

我现在正在实施一个库,用于将数据导出为具有多种设置的各种格式。我也使用Boost.Test,但似乎没有测试文件内容的功能。

出于我的目的,它应该足以检查手头的文件是否包含给定的正则表达式。我真的在寻找一个非常简单的宏,如下所示。

#define BOOST_TEST_MODULE ExportTest
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(CsvExport) 
    BOOST_AUTO_TEST_CASE(SimpleTest) {
        // 
        // ... Code writes Simple.csv to harddisk
        // 
        // 
        //
        std::string regExpr= ... // Arbitrary regular expression
        BOOST_TEST_FILE("Simple.csv", regExpr)
}
BOOST_AUTO_TEST_SUITE_END();
  1. 周围是否有扩展,可以这样使用吗?或者我必须自己写一个宏?

  2. 如果周围没有这样的宏,我怎么能无缝地赋予Boost.Test这样的功能呢?

  3. 我的最终解决方案:

    最后,我在测试中包含了以下简单函数。

    #include <boost/regex.hpp>
    
    bool fileContains(const std::string& filename, const std::string& regexp) {
        std::ifstream file(filename);
        if (file) {
            try {
                std::stringstream buffer;
                buffer << file.rdbuf();
                file.close();
                return boost::regex_search(buffer.str(), boost::regex(regexp));
            }
            catch(const std::exception&) {
                return false;
            }
        } else {
            return false;
        }
    }
    

    用法如下所示:

        BOOST_CHECK(fileContains("Export.csv","-48.434"));
    

1 个答案:

答案 0 :(得分:1)

这只是意见,但我认为在这种情况下扩展Boost.Test是不必要的。我只想编写一个函数match_in_file(fname,regex_as_string),也许只有标题,并将其包含在任何需要它的测试文件中。然后你可以写

BOOST_ASSERT(match_in_file(fname, regexpr));

在我看来,为这种情况扩展Boost将是一个过于单一的设计的例子。在您发布的示例中,您传递了一个csv文件......也许您希望您的find-in-file能够解析csv元素并在其中进行搜索...也许以后您可能会想要不巧妙地应用它们不同的规则(例如,仅在csv文件的某个列中,或在xml的某些节点中)。

如果你扩展Boost,你将获得一个庞大而笨重的界面。如果您编写了一组能够满足您需求的简单函数,那么您可以更清晰地分离责任,并提供更好的重用可能性。此外,您可能会发现这些函数属于其他地方,或者可能以干净的方式从您的其他代码中分解出来。