Boost logo

Boost Test Library: Program Execution Monitor

Introduction
Benefits
Specifications
Compilation
Example Programs
Rationale
Design

Introduction

Boost Test Library の Program Execution Monitor は代わりのmain()関数を提供し、その関数内のtryブロック中でユー ザの作成したcpp_main()関数を呼び出す。 main() では例外をキャッチしてその内容を出力し、ユーザを面倒なエラー 検出やエラー出力作業から解放する。

Program Execution Monitorを使うと、お決まりのHello World プログラムは次のようになる。

#include <iostream>

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

    return 0;
}

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

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

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

Benefits

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

In production programs:

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

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

In test programs:

統一形式でのエラーの報告は、後退テストにおい ても有効であるかもしれない。しかしこの場合は、Test Execution Monitor または Unit Test Frameworkを使用する方が 好ましい。これらを使うことによりTest Tools を使えるようなり、 より細かいエラー情報を発生させることも可能となる。

Specifications of the supplied main()

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

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

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

Requires:

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

効果:

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

Treats as errors:

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

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

Rationale:

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

Returns:

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

The Program Execution Monitor compilation

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

execution_monitor.cpp
cpp_main.cpp

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

Example Program

prg_exec_example.cpp

Rationale

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

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

Design

Boost Test Library Design ドキュメントは、Program Execution Monitor と Execution Monitor. 関係について記述している。reference to the top