UnitTest // RUnit(R ユニットテストフレームワーク)パッケージ中のオブジェクト一覧


UnitTest は関数をテストするコードを記述することで,関数の正しい振舞いを保証します.
その結果,随時改変が行なわれてもバグが存在しない(であろう)ことが期待されます.

RUnit は R での UnitTest 実行のためのフレームワークです.

RUnit の使い方を簡単にまとめてみます.

仕様を決める

これから定義する関数の満たすべき仕様を考えます.

和を求める mysum() を作成することにします.実際には sum() をラッピングするだけです.

mysum() がクリアするべきテストのひとつとして,

 mysum(1:10) == 55

がすぐに思い浮かびます.

テスト

ワーキングディレクトリに tests.R ファイルを作成します.

その 1

tests.R に test.mysum() を記述.慣習として,test.テストする関数名 とします.
これは,runTestFile() の引数 testFuncRegexp で解釈されますので,
testFuncRegexp に適当な正規表現で与えれば変更できます.

 ### tests.R
 test.mysum <- function() {
   checkEqualsNumeric(mysum(1:10), 55)
 }

そして,おもむろに runTestFile() します.

 > runTestFile("tests.R")
 Error in data.class(target) : couldn't find function "mysum"
 Timing stopped at: 0 0 0 0 0 
 Number of test functions: 1 
 Number of errors: 1 
 Number of failures: 0 

テストは失敗します.まだ mysum() を定義していませんので当然です.
ここで大切なのは,「テストは確実に行なわれている」ということです.

その 2

mysum() を定義します.

 ### tests.R
 test.mysum <- function() {
   checkEqualsNumeric(mysum(1:10), 55)
 }
 
 mysum <- function(x) {
 
 }

再びテストを実行します.

 > runTestFile("tests.R")
 Error in checkEqualsNumeric(mysum(1:10), 55) : 
 	Mean relative  difference: 10
 Timing stopped at: 0 0 0 0 0 
 Number of test functions: 1 
 Number of errors: 0 
 Number of failures: 1 

今回も失敗しますが,エラーメッセージは異なります.これは mysum() が期待される値を返していない,つまり,バグを持っているということです.したがって,このバグをなくさなくてはいけません.

といっても,この場合 mysum() がなにもしていない(ので,返値は NULL)だけですが.

その 3

mysum() のバグを潰す.具体的には sum() の値を返すことにします.

 ### tests.R
 test.mysum <- function() {
   checkEqualsNumeric(mysum(1:10), 55)
 }
 
 mysum <- function(x) {
   sum(x
 }

そしてテスト.

 > runTestFile("tests.R")
 Error in parse(file, n, text, prompt) : syntax error on line 7
 Number of test functions: 1 
 Number of errors: 1 
 Number of failures: 0 

あれ? エラーになってしまいました.

Number of erros: には関数にエラーがあるということを示しています.一方,Number of filures: は,testEqualsNumeric() などでの評価が失敗していることを意味します.つまり,前者は R のスクリプトとして間違っている,後者はプログラムの挙動として間違っていることを示します.

その 4

で,今回はそもそもスクリプトが間違っている(sum() の括弧が閉じていない)ので,これを修正します.

 ### tests.R
 test.mysum <- function() {
   checkEqualsNumeric(mysum(1:10), 55)
 }
 
 mysum <- function(x) {
   sum(x)
 }

そしてテストする.

 > runTestFile("tests.R")
 Number of test functions: 1 
 Number of errors: 0 
 Number of failures: 0 

やたっ♪ 成功しました.

コメント



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