Boost logo

Boostテストライブラリ: プログラム実行モニター

ホーム
イントロダクション
メリット
詳細
コンパイル
サンプルプログラム
理論
設計

イントロダクション

Boostテストライブラリのプログラム実行モニター は代わりのmain()関数を提供し、その関数内のtryブロック中でユー ザの作成したcpp_main()関数を呼び出す。 main() では例外をキャッチしてその内容を出力し、ユーザを面倒なエラー 検出やエラー出力作業から解放する。

プログラム実行モニターを使うと、お決まりのHello World プログラムは次のようになる。

#include <iostream>

int cpp_main( int, char* [] ) // 関数名に注意
{
    std::cout << "Hello, world\n";

    return 0;
}

至ってシンプルである。冒頭の関数名をmain からcpp_main()に変更する。ここでargc、arcv変数が明記されているこ とを確認する(たとえ使わないから明記する必要がないとしても)。そして、 それをコンパイルし、プログラム実行モニター ライブラリとリンクする。

このプログラムを実行すると、出力は次ようになる。

Hello, world
no errors detected

ここで、下層にある関数内でruntime_errorが"big trouble"?というメッセージを伴って発生したらどうなるだろうか。 この時の出力は次のようになる。

** exception: std::runtime_error: big trouble
**** error return code 5
********** errors detected; see standard output for details ***********

下層にある関数内でリターンコード5を返した 場合、出力は次のようになる。

**** error return code 5
*********** errors detected; see standard output for details ***********

ここで着目してもらいたいのは、最初のメッ セージが標準出力に出力されているのに対し、最後のメッセージが標準エ ラー出力に出力されていることである。これにより、標準出力と標準エラー 出力を異なるデバイスやファイルに向けることで、エラー通知が見やすくなる。 reference to the top

メリット

統一形式でのエラー・例外の報告。

製品プログラム:

統一形式でのエラーの報告は、スクリプト やバッチファイルなどによってプログラムを自動的に実行する際に特に有 効である。オペレーションシステムによっては、キャッチされていない例外 があるとメッセージボックスが現れ、オペレータによる操作が必要になる。 このような例外を非ゼロの返り値に変更することにより、ライブラリがプログラムを扱い易くなる。

統一形式でのエラーの報告は、プログラムによっ ては意味をなさないことがある。特にそのプログラムのことをよく知ってい る人が手動で行う際には、cpp_main()を使うに値しないであろう。

テストプログラム:

統一形式でのエラーの報告は、後退テストにおい ても有効であるかもしれない。しかしこの場合は、テスト実行モニター または ユニットテストフレームワークを使用する方が 好ましい。これらを使うことによりTest Tools を使えるようなり、 より細かいエラー情報を発生させることも可能となる。

main()の詳細

様々なエラーを1つの値に変換してホスト環境 に返す。また各種のエラー発生の検知・報告を統一形式で行う。

意図している使用方法は次の2通り。

  • 製品プログラムにおいて、単純に最上位の関数であるmain()をcpp_main()に 置き換える。
  • テストフレームワークでcpp_main()を提供し、特定のテストエラーの検知 (キャッチ)・報告を行い、適当な非ゼロ値をを返す。

必要なもの:

ユーザによって作成されたcpp_main()で、main()と同じイ ンターフェースを持つもの。

効果:

try ブロック内でcpp_main( argc, argv )を呼び出す。

エラーとして扱うもの:

  • cpp_main()からの例外。
  • cpp_main()から返る非0値

エラーの詳細をcoutに、要約をcerrに出力する。

関連情報:

エラーの詳細出力をcoutに行い、他の出力と組み合わせることによりエラーの解析を補助する。coutをリダイレクトすることにより、cerrにエラーの要約を出力する。

返り値:

エラーを検知した場合非0値を返す。それ 以外の場合0を返す。 reference to the top

プログラム実行モニターのコンパイル

プログラム実行モニターはオフラインライ ブラリとして提供されており、テストプログラムと一緒にコンパイル、リ ンクする必要がある。次のファイルはBoostテストライブラリ のソースディ レクトリに配置されており、コンポーネントを構成している。

execution_monitor.cpp
cpp_main.cpp

プログラム実行モニターを構成して いるファイルすべてを、プログラム中に直接インクルードすることもできる。 このような使い方をする場合は<boost/test/included/prg_exec_monitor.hpp>を使う。

サンプルプログラム

prg_exec_example
prg_exec_fail1
prg_exec_fail2
prg_exec_fail3

理論

C++ プログラムのコンポーネントは、返り値 や例外など、様々な方法でユーザの検知したエラーを報告する。不正ポイン タ参照など、システムが検知したエラーは別の方法で報告されるが、その方 法は完全にOSまたは処理系依存である。

にもかかわらず、多くの製品 またはテストプログラムのC++ソースは、統一形式によるエラー出力を必要とする環境に おける実行を要求される。たとえば、キャッチし損なってしまった例外を非 0値のプログラム返り値に変換することにより、多くのコマンドライン、ス クリプト、バッチ環境などを適切に処理できる。GUI環境でも、エラーを1つ に統一する代わりに、エラーをプログラム返り値に変換することで同様に扱 うことができる。

設計

Boostテストライブラリ設計のドキュメントは、プログラム実行モニターと実行モニター. 関係について記述している。reference to the top