So-net無料ブログ作成
検索選択

CppUnitのOutputterを作ってみた [プログラミング]

C++用の単体テストフレームワークと言えば、CppUnitが有名…というか、定番です。

で、そのCppUnitは、テストの結果をどういう形式で出力するかを Outputter というクラスで指定します。

CppUnitには、テキスト形式(TextOutputter)、コンパイラ形式(CompilerOutputter)、XML形式(XmlOutputter)が用意されています。
ちなみに、コンパイラ形式とは、コンパイラが出力するエラーメッセージと同じ形式です。
タグジャンプ機能が使えて便利です。

// テキスト形式で標準出力に出力する

CppUnit::TextUi::TestRunner runner;
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());

CppUnit::Outputter* outputter =
     new CppUnit::TextOutputter(&runner.result(), std::cout);

runner.setOutputter(outputter);

runner.run();
// コンパイラ形式で標準出力に出力する

CppUnit::TextUi::TestRunner runner;
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());

CppUnit::Outputter* outputter =
     CppUnit::CompilerOutputter::defaultOutputter(&runner.result(), std::cout);

runner.setOutputter(outputter);

runner.run();
// XMLファイルに出力する
CppUnit::TextUi::TestRunner runner;
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());

const char* filename = "test_result.xml";

std::ofstream out(filename);
CppUnit::Outputter* outputter =
     new CppUnit::XmlOutputter(&runner.result(), out);

runner.setOutputter(outputter);

runner.run();

さて、

テストの結果をすばやく知りたい場合は、標準出力に出力するのが便利です。
一方、テストの状況を集計したり、エヴィデンスとして保存しておきたい場合は、XMLに出力した方が便利です。

だったら、テキスト形式で標準出力に出力しつつ、XML形式でファイルに出力できたら、もっと便利じゃないかな。

そんなわけで、複数の Outputter へ同時に出力する Outputter を作ってみました。

class MultiOutputter : public CppUnit::Outputter
{
  private:
    std::vector<CppUnit::Outputter*> outputter_;

  public:
    ~MultiOutputter()
    {
        std::vector<CppUnit::Outputter*>::iterator it;
        for (it = outputter_.begin(); it != outputter_.end(); ++it)
            delete *it;
    }

    void write()
    {
        std::for_each(outputter_.begin(),
                      outputter_.end(),
                      std::mem_fun(&CppUnit::Outputter::write));
    }

    void add(CppUnit::Outputter* o)
    {
        outputter_.push_back(o);
    }
};

ちなみに、こんな感じで使います。

// 標準出力とXMLファイルの両方に出力する
CppUnit::TextUi::TestRunner runner;
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());

const char* filename = "test_result.xml";

MultiOutputter* outputter = new MultiOutputter();

const char* filename = "test_result.xml";

std::ofstream out(filename);
outputter->add(new CppUnit::XmlOutputter(&runner.result(), out));
outputter->add(new CppUnit::TextOutputter(&runner.result(), std::cout));

runner.setOutputter(outputter);

runner.run();
[新幹線] 今日の一冊
幕末暗号戦争

幕末暗号戦争

  • 作者: 永井 義男
  • 出版社/メーカー: 幻冬舎
  • 発売日: 1998/12
  • メディア: 単行本
タイトルに反して、暗号はあまり出てこない
どっちかと言うと「幕末諜報物語」?

タグ:C++ CppUnit
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。