Содержимое тестового файла 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 таким функционалом, если под рукой нет такого макроса?

Мое окончательное решение:

Наконец, я включил в свои тесты следующую простую функцию.

#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"));

person Aleph0    schedule 17.02.2016    source источник


Ответы (1)


На самом деле это просто мнение, но я думаю, что расширение Boost.Test в этом случае не требуется. Я бы просто написал функцию match_in_file(fname, regex_as_string), возможно, только заголовок, и включил бы ее в любые тестовые файлы, которые в ней нуждаются. Тогда вы могли бы написать

BOOST_ASSERT(match_in_file(fname, regexpr));

На мой взгляд, расширение Boost для такого случая было бы примером чрезмерно монолитной конструкции. В опубликованном вами примере вы передаете CSV-файл... возможно, вы хотите, чтобы ваш поиск в файле анализировал CSV-элементы и выполнял поиск в них... возможно, позже вы захотите применить некоторые слегка отличающиеся правила (например, только в определенном столбце файла csv или в определенных узлах xml).

Если вы расширите Boost, вы получите большой и громоздкий интерфейс. Если вы напишете набор простых функций, которые делают то, что вам нужно, у вас будет более четкое разделение ответственности и лучшие возможности повторного использования. Кроме того, вы можете обнаружить, что эти функции принадлежат другим местам или могут быть выделены из другого вашего кода чистым способом.

person Spacemoose    schedule 17.02.2016
comment
Большое спасибо за этот подробный ответ. Мне стало ясно, что не будет решения, которое могло бы удовлетворить всем требованиям всех тестов. Кажется, мне приходится полагаться на написание простой функции, как вы предложили. - person Aleph0; 17.02.2016