📝

R : testthatで関数テストを実装してみた

2022/08/07に公開

testthatとは

testthatとは、Rでテストコードを簡単に実装できるパッケージです。
ある関数を作成した際に、期待している結果がちゃんと返ってきているかを確認することはバグを未然に防ぎやすくできますし、精神衛生的にも嬉しいですよね。

https://testthat.r-lib.org/index.html

想定しているフォルダ構造

今回は以下のような前提でテストを実装するサンプルを作成してみました。
フォルダ構造はこのような状況を想定しています。またカレントディレクトリはルートディレクトリにしてあるとします。

.
├── analysis
│   ├── script1.r
│   ├── script2.r
│   └── ...
├── functions
│   ├── myfunc1.r
│   ├── myfunc2.r
│   └── ...
└── test
    ├── run-test.r
    └── test-dir
        ├── test-myfunc1.r
        ├── test-myfunc2.r
        └── ...

サンプル

自作関数

ここではmyfunc1, myfunc2をそれぞれ足し算、割り算を行う関数として定義します。割り算の場合、ゼロ除算で特定の警告を出すことを想定します。

myfunc1 <- function(x,y) return(x + y)
myfunc2 <- function(x,y) {
  if(y == 0) {
    stop("ZeroDivisionError")
  } else { 
  return (x / y)
  }
}

テストコード

ここではテストの中身としては以下を実行しようと思います。

myfunc1.r

testthat::expect_equal(myfunc1(1,2), 3)

myfunc2.r

testthat::expect_equal(myfunc2(10,2), 5)
testthat::expect_error(myfunc2(10,0), "ZeroDivisionError")

テストの実行

今回はテストコードを関数ごとに分けているので、それぞれを実行するようにコードを実装します。

run-test.r

# testthatの読み込み
lib <- "testthat"
if(!require(lib, character.only = T) {
  install.packages(lib)
}
require(lib)

# 関数の読み込み
func_dir <- "functions"
func_files <- list.files(func_dir) # 関数ファイル
for(func_file in func_files) {
  path <- file.path(func_dir, func_file)
  source(path)
}

# テストの実行
test_dir <- "test/test-dir"
test_files <- list.files(test_dir) # テストファイル 一覧
for(test_file in test_files) {
  path <- file.path(test_dir, test_file)
  testthat::test_file(path)
}

実行結果

このようにテスト結果がコンソールに表示されます。
無事テストが全てパスしました。Enjoy!

※テスト実行後_snapsというテストのスナップショットフォルダが生成されます。

Discussion