テストごとに新しい数値セットで関数をテストしたいと思います。アイデアは、私が予期していなかったインスタンスで失敗を達成することです。
library(testthat)
hypotenuse_length <- function(a, b){
sqrt(a^2 + b^2)
}
bad_hypotenuse_length <- function(a, b){
sqrt(a^2 + b^2) + 1
}
test_that("Hypotenuse is always less than sum of other two sides", {
a <- abs(rcauchy(1))
b <- abs(rcauchy(1))
expect_lte(bad_hypotenuse_length(a, b), a + b)
})
a
問題は、失敗を受け取ったときに、どの値が失敗をb
引き起こしたのかわからないことです。
リバース エンジニアリングによって、特定の操作でこれを実現できますexpect_lte
。
my_expect_lte <- function(a, b, actual, expected, label = NULL, expected.label = NULL){
op <- match.fun("<=")
lab_act <- testthat:::make_label(actual, label)
lab_exp <- testthat:::make_label(expected, expected.label)
stopifnot(is.numeric(actual), length(actual) == 1)
stopifnot(is.numeric(expected), length(expected) == 1)
msg <- "not less than"
diff <- actual - expected
testthat::expect(op(diff, 0),
sprintf("%s is %s %s. Difference: %.3g. a = %.3g b = %.3g",
lab_act, msg, lab_exp, diff, a, b))
}
set.seed(1) # not ordinarily present
a <- abs(rcauchy(1))
b <- abs(rcauchy(1))
my_expect_lte(a, b, bad_hypotenuse_length(a, b), a + b)
エラー: bad_hypotenuse_length(a, b) は a + b より小さくありません。差: 0.143。a = 1.1 b = 2.35
既存の関数を使用して同様の情報を返す方法はありますか? つまり、 と同じものを返しますが、expect_...
渡された引数の値も含みます。( `testthat`テストが`R`で失敗した場合にカスタム診断情報を印刷するソリューションは、テスト結果に関係なく情報を出力するか、既存のテストに適合しません。)