Cygnus - CSK 共同研究:テスティング フレームワーク定義

Cygnus Support, January 31, 1996
(Gordon Irlam, gordoni@cygnus.com)


Cygnus - CSK の共同開発プロジェクトの一環として、我々は Guile 用テスティ ング フレームワークの定義を要求された。この文書では、このテスティング フレームワークの仕様を記述する。

動機

テストを行うことの意図は、Guile が信頼性の高い、高品質のプロダクトとし て存在することを保証することにある。

我々は、Guile 処理系が、ドキュメンテーションで記述しているGuile の意図 された動作と矛盾しないことをテストする必要がある。ゆえに、テストの遂行 にあたって、特定のテストの正しい結果とはどうあるべきなのか、また Guile がそのテストに成功したか失敗したかを判断するために、参照することが許さ れるのは、ドキュメンテーションに限られる。Guile の実装を参照してはなら ない。

テスティング フレームワーク

我々は、DejaGNU を使ってテストを駆動することを決定した。

DejaGNU はテストを実行するための単純なフロントエンドを提供する。 DejaGNU はテストの選択と実行、テスト実行結果のログ収集と集計、 そしてテストの失敗の判定と記録をサポートする。

DejaGNU は expect と Tcl の上に構築されている。expect は Don Libes 作 の 対話型アプリケーション制御用 Tclパッケージである。Tcl は John Ousterhout 作の Tool Command Language である。Cygnus はすでに、DejaGNU、 expect、そして Tcl に経験を持っている。DejaGNU の著者 Rob Savoy は Cygnus 社員である。

DejaGNU の現行リリースは、Guile の効果的なテストという我々の用途にとっ て十分な機能を提供していると思われる。

テストスイートは、以下のサポートされるプラットフォームのすべてで実行さ れる。

    SGI    IRIX 5.3
    Sun    Solaris 2.5
    PC     Linux

Guile のソースのトップレベル ディレクトリの下に "testsuite" ディレクト リを作成する。このディレクトリに Guile のコアのソフトウェアのうちサポー トされるコンポーネントそれぞれに対するテストケースを入れる。

テストケース

DejaGNU は Guile のテストを実行するためのフレームワークを提供する。 この上に、我々は DejaGNU で実行できるような Guile のテストスイート を開発する。

テストケースは、我々の Scheme 言語の知識と Guile 処理系内部の知識 の両方に基づいて生成される。

初期のテストケースのうちいくつかは、ネット上で使用可能な Aubrey Jaffer の IEEE/R4RS 適合テストスイートから派生できる。これらの Scheme 言語の テストが提供するカバレージによっては、Scheme 言語のテストを追加した上 で我々のテストスイートに組み込む必要があるかもしれない。

また、Guile 固有の機能をテストするためのカスタム テストも開発する必要 がある。特に、slib ライブラリと rx ライブラリに対してテストが必要とな る。これらのテストは、それぞれのライブラリの意図された機能を記述するド キュメンテーションから派生される。

我々の計画では、サポートされるソフトウェア コンポーネントのそれぞれを 網羅するテストを開発する。

Guile の開発中に、遭遇したバグは改修される。こうしたバグを強調するテス トケースを作成し、Guile のテストスイートに追加する。

テスト カバレージ

我々は、テスト カバレージを測定することで、我々が開発したテストケース が Guile のテストにどれくらい有効かを算出する。我々が生成するテスト カバレージのデータは、Guile ソースのうちテストケースが実行している 比率の指標を与える。

我々にとって使えそうなテスト カバレージ ツールはいくつかある。 gprof、gcov、そして tcov が検討された。暫定的な結論として、 最初は Solaris 上で gprof を使ってテスト カバレージのデータを収集し、 これを解析すべきである。gprof を使う利点の1つに、ソースにアクセスでき、 我々にとって必要なように改修、拡張、または改良ができることがある。

gprof は、テストケースの解析とテスト カバレージの測定に十分なデータを 提供する。

gprof は、コンパイラが実行可能コードを変更してあるルーチンが呼び出される 度にカウンタをインクリメントするようなコードを生成することにより動作する。 プログラムを実行すると、これらのカウントが収集され、結果がファイルに書き 出される。次に、gprof が実行されて可読形式でこれらの結果を表示する。

gprof をサポートされるプラットフォームすべてで稼働させるには若干の作業 が必要である(たとえば、gprof は SGI への移植が必要であり、またライブラ リすべてに bb_exit_func() を追加する必要があるだろう)。 gprof は Solaris 上で稼働することがすでに知られている。Solaris 上のみで gprof を実行するだけでも、テスト カバレージを正確に測定するという点では十分 である。したがって我々は、gprof をその他のサポートされるプラットフォー ムに移植する必要はない。

GNU バージョンの gprof には、基本ブロックの呼び出しのカウントのサポー トが含まれており、これはソースコードの特定の行にマップし返すことができ る。残念ながら、このコードは今のところ、 Guile のサポートされるプラッ トフォームのいずれでも動かない。この情報が必要であると結論づけるならば、 これができるように gprof を改修するか、または tcov のような他のツール を使うかのいずれかに決定することになる。

gprof を実行し、結果のデータを結合して、生成された結果を解析するような ツールを開発する必要がある。これらのツールは必要の生じた時点で作成される。

gprof に関して不確定なのは、多重スレッドの下で信頼性をもって動作するか どうか、である。これが問題になるようであれば、我々のテスト カバレージ の測定から、マルチスレッドの Guile のテストケースを除外する必要がある かもしれない。これは、我々がマルチスレッドのテストケースを作成しない、 という意味ではなく、単にこれらをテスト カバレージの測定の対象としない、 ということである。

gprof は基本的な Scheme インタプリタについてテスト カバレージ情報を提 供できるであろう。しかしながら、gprof は Scheme で記述された gls およ びslib のソースについてはテスト カバレージ情報を提供することはできない。 今のところこのような情報を収集する容易な方法はない。こうした情報を収集 できるためには、Guile のコアの変更が必要になると思われる。現時点では、 このために必要な作業がなされることは保証しかねる。

自動化テスト

Cygnus は、gcc のテスト用に自動化テスト システムを開発した。 このシステムはソース ツリー中のカレントの gcc のソースをチェックアウトし、 特定のプラットフォーム上で構築し、一連のテストを実行し、結果を解析し、 電子メイルを送って起こり得る問題をレポートしてから、次のプラットフォーム 上でgcc を構築しようとする。

Guile のテスティング フレームワークを作成したあかつきには、これを Cygnus の既存の自動化テストのフレームワークへの統合を試みて、 退行の検出できるようにすべきである。

性能テスト

Cygnus では今のところ、 Guile のパフォーマンスを公式にテストする計画はない。

バイトコード コンパイラの作業の一環として、若干の非公式な性能テストが なされる可能性はある。

テスト監査

テストケースが作成され、テスト カバレージが測定されたら、我々はテスト 監査を執り行う。テスト監査の目的は、我々のテストに対するアプローチの有 効性を評価することである。

テスト監査で網羅すべき課題には以下のようなことが含まれる。

テストの強化

我々は CSK と共同でテスト監査のレビューを行い、遂行する必要があるテス トの強化について合意に達する。これらの実装は Cygnus の責任において行う。