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();
今日の一冊 | ||
|
タイトルに反して、暗号はあまり出てこない どっちかと言うと「幕末諜報物語」? |
2010-01-18 07:37
nice!(0)
コメント(0)
トラックバック(0)
コメント 0