petardfsでアプリケーションをテストする:Programing Bible(2/2 ページ)
petardファイルシステムは、エラーだけを生成するように設計されたファイルシステムである。システムテストと単体テストを行うのに役立つ。
petardfsの実行
完全なXML設定ファイルは、petardfsディストリビューションtarballにtestsuite/sampledata/config -simple-filesystem-simple-error-in-read-file1.xmlとして収められている。simple- filesystem.tarには、file1.txt、file2.txtなどの名前の一連のファイルを持つ小さなファイルシステムが含まれる。設定ファイルには、これらのサンプルファイルで発生する各種のエラーが定義されている。
以下の一連のコマンドでは、petardfsをマウントし、このエラー生成ファイルシステムに簡単な指示を送っている。トップレベルへの「...」パスの部分は、petardfsのtarballディストリビューション内のファイルへのパスで置き換えることができる。petardfsで file1.txtにdiffコマンドを実行すると、“Interrupted system call”のエラーが起きることに注意してほしい。catコマンドではこのエラーが起きても適切に再試行が行われるので、この問題を回避するため、catを使ってファイルのコピーを作成してからdiffをこのコピーに対して実行する。file2.txtのエラーは、4096番目のバイトで起きる単純なEIOエラーである。catは、このエラーをstderr経由でリポートし、終了する。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
Dejagnu
petardfsディストリビューションは、petardfsをアプリケーションのテストスイートに統合する方法のサンプルとしても使える。petardfsには、petardfsの関数が期待通りに動作することをテストするためにDejaGnuを使用する、限定的なテストスイートが含まれている。トップレベルのMakefile.amでは、DejaGnuはAUTOMAKE_OPTIONSに含まれる。サブディレクトリtestsuite/petardfs.test下のpetardfs.expには、入門レベルのpetardfs用 TCL/expect DejaGnuテストスイートが含まれる。
petardfs.expによって実行されるテストは、petardfsそのものが期待通りに動作するかどうかを確認する。ただし、 petardfsをテストするコマンドと、petardfs上で動作するアプリケーションをテストするコマンドは、非常に似ている。例えば、さまざまな設定オプションを使ってpetardfsを実行することや、proc unmount_petardfs {}のような関数を使ってpetardfsファイルシステムを再度アンマウントする必要があることは、両者に共通する。
テストスイートの中心部は、petardfs.expファイルの最後にあるrun_all関数にある。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
run_simple_petardfs_test_suite関数は、指定されたエラー設定を使ってpetardfsファイルシステムをマウントし、指定された一連のテストケースをpetardfsに対して実行し、期待通りの結果かどうかをチェックする。petardfs.expのテストケースでは、さまざまなコマンドをpetardfsに対して実行することで、特定のエラーメッセージが生成されることが期待される。最後に、run_simple_petardfs_test_suiteは、petardfsをアンマウントして、テストスイート内のほかのテスト関数が別の設定でpetardfsを同じマウントポイントにマウントできるようにし、またテストスイートの完了後に動作中のpetardfsのインスタンスが残らないようにする。
petardfs.expには、幾つかのユーティリティ関数が用意され、利用される。rt_expected{ testname expected cmd }関数は、診断結果または成功をリポートするためにtestnameを使ってコマンド(cmd)を実行する。expectedの文字列は、テストの成功時にコマンドの出力に表示される。verify_output_identical { cmdA cmdB diffflags }関数は、2つのコマンドを実行し、diff -Nsuarとdiffに渡される追加フラグdiffflagsを使って、両者の出力を比較する。このようなユーティリティ関数があることで、DejaGnuテストスイートケースをpetardfs用に作成する作業はかなり簡単になる。ユーティリティ関数では、アプリケーションのタイムアウトエラーとspawn/expectペアが処理される。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
まとめ
petardfsを使うことで、アプリケーションに厳しい目を向け、エラー条件に適切に反応するかどうかを確認できる。テストスイートを通してアプリケーションをpetardfs上で実行することで、プロジェクトのエラー処理コード内にエラーを検出し、修正できる。起動時にファイルを開くことに失敗した場合など、多くのエラー状況においてアプリケーションは単に終了するだけでよいが、ログファイルの切り詰めに失敗したような場合は、エラーの発生をメッセージで報告するだけで、動作を継続する必要がある。petardfsを使うと、読み込みエラーのような一般的なエラーとtruncate(2)エラーのような珍しいエラーの両方をテストできる。
関連記事
- ファズテスト――シンプルだが強力なコードテスト手法
堅実なコードとは、一貫性と正常性が検証されていない外部データは決してプログラムに入力しないという原則を守るものである。プログラム内のバグの存在を実証できるファズテストは、論理的な人間には思いもよらないバグを見つけ出してくれるかもしれない。 - プログレッシブプログラミング――テストの前にコードの不具合を発見する
Javaプログラマーなら、Eclipseを知らない人はいないだろう。だが、単なるエディタやコンパイラの環境として使っているだけなら、もったいない。Eclipseプラグインを活用すれば、テストの前にコードの改善が図れるからだ。コードの品質を早い段階で高めるプラグインを紹介しよう。 - テストファーストによるソフトウェア開発の衝撃(前編)
皆さんはテストの本質を理解されていますか? 実は、テストには機能検証をするということ以上に重要な役割があるのです。本稿では、テストファーストがソフトウェアアーキテクチャに及ぼす多大な影響について説明します。 - テストファーストによるソフトウェア開発の衝撃(後編)
テストファーストがソフトウェアアーキテクチャに及ぼす多大な影響について説明する本稿。後編では、「究極の仕様書」と言っても差し支えないであろう受け入れテストについて触れたいと思います。
Copyright © 2010 OSDN Corporation, All Rights Reserved.