1

テストごとに新しい数値セットで関数をテストしたいと思います。アイデアは、私が予期していなかったインスタンスで失敗を達成することです。

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`で失敗した場合にカスタム診断情報を印刷するソリューションは、テスト結果に関係なく情報を出力するか、既存のテストに適合しません。)

4

1 に答える 1

1

あなたの質問に対する直接的な回答はありませんが、ランダム化されたテストのフレームワークを提供するため、 quickcheckパッケージを使用することをお勧めします。失敗例を検査するための優れたツールが付属しています (チュートリアルreproの関数の使用法を参照してください)。

于 2016-07-20T14:39:16.447 に答える