SSブログ

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

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。