Boost 1.44.0(およびそれ以降のバージョン)では、テストプログラムの出力を、テストが含まれるマスターテストスイートにちなんで名付けられたファイルにリダイレクトするグローバルフィクスチャを作成するために、次のコードが必要です(Boostドキュメントを参照) 。
#include <boost/test/unit_test.hpp>
#include <string>
#include <fstream>
struct LogToFile
{
LogToFile()
{
std::string logFileName(boost::unit_test::framework::master_test_suite().p_name);
logFileName.append(".xml");
logFile.open(logFileName.c_str());
boost::unit_test::unit_test_log.set_stream(logFile);
}
~LogToFile()
{
boost::unit_test::unit_test_log.test_finish();
logFile.close();
boost::unit_test::unit_test_log.set_stream(std::cout);
}
std::ofstream logFile;
};
BOOST_GLOBAL_FIXTURE(LogToFile);
この例では、 Steve TownsendlogFile
が提供した回答のような静的メンバーではありません。これは、静的メンバーとして宣言するとXMLが誤って生成され、フィクスチャ構造体へのアクセスがこの方法でスレッドセーフではないためです。logFile
ただし、Boost 1.44.0にはバグがあるようです。これlogFile
により、がフィクスチャ構造体の静的メンバーでない場合、誤ったXML出力が生成されます(おそらく前に述べたのと同じバグです)。これを修正するlogFile << "</TestLog>" << std::flush;
には、デストラクタでファイルストリームを閉じて有効なXMLを生成する前にこの行が必要です。
@Wracky(以下のコメント)のおかげで、タグを手動で書き込むよりもはるかにクリーンなソリューションである行logFile << "</TestLog>" << std::flush;
を置き換えました。boost::unit_test::unit_test_log.test_finish();
注:テストは、次のパラメーターを使用して実行されます --output_format=XML --log_level=all --report_level=no
。これにより、継続的インテグレーションサーバーJenkinsのxUnitプラグインで結果のXMLファイルを使用できるようになります。