特集
» 2007年09月27日 01時30分 公開

Programing Bible:petardfsでアプリケーションをテストする (2/2)

[Ben-Martin,Open Tech Press]
SourceForge.JP Magazine
前のページへ 1|2       

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経由でリポートし、終了する。


$ mkdir /tmp/petard
$ cd /tmp/petard
$ cp .../simple-filesystem.tar .
$ cp .../config-simple-filesystem-simple-error-in-read-file1.xml
$ mkdir -p foo petard-foo
$ cd foo
$ tar xvf ../simple-filesystem.tar
$ cd ..
$ petardfs -e config-simple-filesystem-simple-error-in-read-file1.xml -u `pwd`/foo petard-foo
$ ls -l petard-foo/
total 512
-rw-rw---- 1 ben ben 50000 2007-03-14 16:15 barB.txt
-rw-rw---- 1 ben ben 50000 2007-03-14 16:15 barC.txt
-rw-rw---- 1 ben ben 50000 2007-03-14 16:15 file1.txt
-rw-rw---- 1 ben ben 50000 2007-03-14 16:15 file2.txt
-rw-rw---- 1 ben ben 50000 2007-03-14 16:15 file3.txt
-rw-rw---- 1 ben ben 50000 2007-03-14 16:15 file4.txt
-rw-rw---- 1 ben ben 50000 2007-03-14 16:15 file5.txt
-rw-rw---- 1 ben ben 50000 2007-03-14 16:15 fooA.txt
-rw-rw---- 1 ben ben 50000 2007-03-14 16:15 simplefile.txt
drwxrwx--- 2 ben ben  4096 2007-03-14 16:16 sub1
drwxrwx--- 2 ben ben  4096 2007-03-14 16:16 sub2

$ diff -Nuar petard-foo/file1.txt foo/file1.txt diff: petard-foo/file1.txt: Interrupted system call $ cat petard-foo/file1.txt >|/tmp/file1.txt $ diff -Nuar /tmp/file1.txt foo/file1.txt
$ cat petard-foo/file2.txt >|/tmp/file2.txt cat: petard-foo/file2.txt: Input/output error $ diff -Nuar petard-foo/file2.txt foo/file2.txt diff: petard-foo/file2.txt: Input/output error

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関数にある。


proc run_all {} {

    verbose "Running all existing tests... this will take a long time..."     run_noerror_petardfs_test_suite     run_simple_petardfs_test_suite }
run_all

 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ペアが処理される。


proc run_simple_petardfs_test_suite {} {

    global PTT     global UTBASE     global SDATA     global verbose     global PETARDFS
    set ERRORDESC "$SDATA/config-simple-filesystem-simple-error-in-read-file1.xml"     set BASEDIR $PTT     setup_basedir_and_input;
    cd $BASEDIR     system $PETARDFS -e "$ERRORDESC" -u "$BASEDIR/input" "$BASEDIR/fusefs"     if { $verbose > 1 } {     send_user "Mounted petardfs with specified errors:$ERRORDESC...\n"     }
    set testname [rt_version "io-error-at-4096" ]     rt_expected $testname  "Input/output error" "cat $BASEDIR/fusefs/file2.txt"
    # file1.txt has some EINTR returns     verify_output_identical \     "cat $BASEDIR/input/file1.txt" \     "cat $BASEDIR/fusefs/file1.txt" "-Nuar"
        :         :
    unmount_petardfs; }

まとめ

 petardfsを使うことで、アプリケーションに厳しい目を向け、エラー条件に適切に反応するかどうかを確認できる。テストスイートを通してアプリケーションをpetardfs上で実行することで、プロジェクトのエラー処理コード内にエラーを検出し、修正できる。起動時にファイルを開くことに失敗した場合など、多くのエラー状況においてアプリケーションは単に終了するだけでよいが、ログファイルの切り詰めに失敗したような場合は、エラーの発生をメッセージで報告するだけで、動作を継続する必要がある。petardfsを使うと、読み込みエラーのような一般的なエラーとtruncate(2)エラーのような珍しいエラーの両方をテストできる。

関連キーワード

テスト | バグ | 単体テスト | Programing Bible


前のページへ 1|2       

Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ

マーケット解説

- PR -