Как проверить выход логгера буста в модульном тестировании? - PullRequest
0 голосов
/ 19 ноября 2018

Мое приложение использует BOOST_LOG_TRIVIAL для регистрации сообщений. Я подумал, что хорошо бы проверить в тесте (gtest), что в определенных сценариях пишутся правильные сообщения.

Есть ли способ как-то получить доступ к тому, что там было написано после вызова кода? Или сначала надо каким-то образом издеваться?

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

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

После ответа Майка, в котором я считаю, что необходимость создания файла является недостатком, я провел небольшое исследование и нашел вместо этого способ использования потока строк:

class boost_logger_test : public testing::Test
{
    typedef boost::log::sinks::synchronous_sink<boost::log::sinks::text_ostream_backend> sink_t;
    boost::shared_ptr<sink_t> streamSink;
    std::stringstream ss;

public:
    virtual void SetUp()
    {
        streamSink = boost::log::add_console_log(ss);
    }

    virtual void TearDown()
    {
        boost::log::core::get()->remove_sink(streamSink);
        streamSink.reset();
    }

    std::vector<std::string> getLogMessages()
    {
        std::vector<std::string> messages;
        std::string msg;
        while (std::getline(ss, msg, '\n'))
        {
            messages.push_back(msg);
        }
        return messages;
    }
}

Тогда вы можете легко использовать сообщенияв тестах, например:

ASSERT_THAT(getLogMessages(), ElementsAre("Just some log message"));
0 голосов
/ 19 ноября 2018

В вашем наборе googletest вы можете использовать boost::log средства в каждом тестовом случае, чтобы перенаправлять сообщения BOOST_LOG_TRIVIAL в файл.После написания нужных вам сообщений BOOST_LOG_TRIVIAL вы можете сбросить файл, открыть его и убедиться, что в нем есть ожидаемое содержимое.Например:

gtester.cpp

#include <gtest/gtest.h>
#include <boost/shared_ptr.hpp>
#include <boost/log/sinks/sync_frontend.hpp>
#include <boost/log/sinks/text_file_backend.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/trivial.hpp>
#include <string>
#include <fstream>

using sink_t = boost::log::sinks::synchronous_sink<boost::log::sinks::text_file_backend>;

struct boost_log_tester : ::testing::Test {
    void SetUp() {
        file_sink = boost::log::add_file_log("boost.log");
    }
    void TearDown() {
        boost::log::core::get()->remove_sink(file_sink);
        file_sink.reset();
    }
protected:
    boost::shared_ptr<sink_t> file_sink;
};

TEST_F(boost_log_tester,info_msg)
{
    std::string msg = "An informational severity message";
    BOOST_LOG_TRIVIAL(info) << msg;
    file_sink->flush();
    std::ifstream captured_cout("boost.log");
    ASSERT_TRUE(captured_cout.good()) << "Failure executing test: Could not open `boost.log` for reading";
    std::string cout_str;
    std::getline(captured_cout,cout_str);
    EXPECT_NE(cout_str.find(msg),std::string::npos);
}

TEST_F(boost_log_tester,error_msg)
{
    std::string msg = "An error severity message";
    BOOST_LOG_TRIVIAL(error) << msg;
    file_sink->flush();
    std::ifstream captured_cerr("boost.log");
    ASSERT_TRUE(captured_cerr.good()) << "Failure executing test: Could not open `boost.log` for reading";
    std::string cerr_str;
    std::getline(captured_cerr,cerr_str);
    EXPECT_NE(cerr_str.find(msg),std::string::npos);
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

Компиляция и ссылка:

$ g++ -Wall -Wextra -DBOOST_LOG_DYN_LINK -c gtester.cpp
$ g++ -o gtester gtester.o -lboost_log -lboost_thread -lboost_system -lgtest -pthread

И работает так:

$ ./gtester 
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from boost_log_tester
[ RUN      ] boost_log_tester.info_msg
[       OK ] boost_log_tester.info_msg (0 ms)
[ RUN      ] boost_log_tester.error_msg
[       OK ] boost_log_tester.error_msg (2 ms)
[----------] 2 tests from boost_log_tester (2 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (2 ms total)
[  PASSED  ] 2 tests.
...