UnitTest

ある機能を提供する関数を作成する場合に,

 (1) まず,その挙動を Test する関数を用意し
 (2) この Test をパスすることを目的として当該の関数を書いていく

という方法論です.この Test -> Release -> Test -> Release のサイクルを繰り返すことで,(部分的に)正常な動作が常に保証された関数を逐次完成させていきます.

一般的にはオブジェクト指向言語においてクラスの振舞いを Test する文脈で導入されますが,R の場合は日常的にはクラスの作成よりも関数の作成の方が多いと思われるので,以上のように記述しました.


CRAN に登録されているRUnit パッケージを利用して,R でも UnitTest を実践することができます. RUnit を使う に使用例が記されています.


alternative approach

その他には,プログラムの正しさのチェック に diff を用いたチェック例があります.

プログラムの正しさのチェック (7) 注釈より

 * 膨大な出力ファイルでもかまわない
 * プログラムの改訂があれば,必要に応じて answer ファイルも改訂する
 * プログラムの改訂があったとき,いつでもこのチェックをする必要はない

対照しますと,UnitTest では

 * 膨大なチェック個数でもかまわない
 * 関数を修正しても,(正常に動作している)テスト関数は修正しない
 * 関数の修正があったときには,必ずテストを実行する

という違いがあります.


疑問


R において,UnitTest 的な Test Driven な関数作成を行えると,幾つかの関数を連係させたアプリケーションを作成する際に有用な Tips になると思います.


UnitTest のコンセプトを説明するためのサンプル

(1) test.myfunc() を用意する.

 test.myfunc <- function()
 {
    if( myfunc( 1, 1 ) == 2 ) {
       return( TRUE )
    else
       return( FALSE )
    }
 }

(2) Test を行う

失敗する.

今回の場合は,そもそもテスト関数にエラーがある.

「テスト自体が間違っている」という可能性は常に存在する.

(3) test.myfunc() を修正し,再度 Test する

再び,失敗する.

myfunc() が定義されていない.

しかし,test.myfunc() は正常に実行されることが確認された.

(4) myfunc() を書く

 myfunc <- function(a, b)
 {
    return(a - b)
 }

(5) テストを行う

三度目の失敗.myfunc() で差をとっているため.

(6) myfunc() を修正し,Test する

成功.

(7) myfunc() の拡張が決まった

(8) test.myfunc() にチェック項目を追加し,テストする

あ,うまくいった.R だからね.


コメント


リンク


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-03-25 (土) 11:19:17