3

デフォルトでは、レポートは標準エラーに向けられているので、ファイルにリダイレクトする必要があります。私の質問は、これをグローバルフィクスチャ内で実行するかどうかです。それは私にとってどういうわけかうまくいかないようです。

これは私が試したものです-

struct MyConfig
{
 MyConfig()
  : testReport("fileName.log")
  {
    if(!testReport.fail())
     original = std::cerr.rdbuf(testReport.rdbuf());
  }
  ~MyConfig()
    {        
        cerr.rdbuf(original);        
        testReport.close();
    }
    ofstream testReport;
    streambuf* original;

 };

 BOOST_GLOBAL_FIXTURE(MyConfig);

テストの実行後、指定された名前で0kbのファイルが作成されますが、レポートはコンソールでのみ出力されます。

4

3 に答える 3

5

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ファイルを使用できるようになります。

于 2011-04-14T08:17:53.007 に答える
5

完全を期すために:

必要がなければ、入力を自分でリダイレクトする必要はありません。コマンドライン引数を使用してログファイルを指定することもできます。

C:\MyTest.exe --log_sink=fileName.log

見つけるのに少し時間がかかりました。お役に立てれば!

于 2014-04-08T16:12:27.480 に答える
4

ここから適応し、Boost1.34.1で動作すると主張されているこの代替案を試すことができます。これは、Boostが意図しているとおりのようです。結果ストリームオーバーライドの使用法を参照してください。

//
// run_tests.cc
//

#define BOOST_AUTO_TEST_MAIN

#include <iostream>
#include <fstream>
#include <cassert>
#include <boost/test/auto_unit_test.hpp>
#include <boost/test/results_reporter.hpp>

std::ofstream ReportRedirector::out;

struct ReportRedirector
{
    ReportRedirector()
    {
        out.open("fileName.log");
        assert( out.is_open() );
        boost::unit_test::results_reporter::set_stream(out);
    }
private:
    static std::ofstream out;
};

BOOST_GLOBAL_FIXTURE(ReportRedirector)
于 2010-09-24T14:26:32.037 に答える