如果在`R`中`testthat`测试失败,则打印自定义诊断信息

时间:2014-11-14 10:48:15

标签: r unit-testing testthat

我使用testthat单元测试来检查函数返回的data.frame是否与我期望它返回的相同。如果测试失败,testthat将打印一些诊断信息,例如:

MyFunction(df.orig) is not identical to df.expected. Differences: 
Names: 1 string mismatch

但是,我真的希望看到函数的实际输出,即打印返回的data.frame。如果testthat测试失败,有没有办法打印测试函数的输出(或其他一些自定义诊断信息)?

2 个答案:

答案 0 :(得分:2)

间接地,是的!如果您查看expect_that的参数,您会看到" info"参数 - 您可以在此处抛出匿名函数或调用,以打印结果。所以,像:

expect_that(df.orig, is_identical_to(df.expected), info = print(df.orig))

这样做的缺点是,即使测试通过,也会/ always / print df.orig或类似的信息。

执行此操作的唯一方法(并且唯一可以确保在发生错误时触发)的方法是使用tryCatch;类似的东西:

tryCatch(
    expr = {
        expect_that(df.orig, is_identical_to(df.expected))
    }, 
    error = function(e){
        print(e)
        print(df.orig)
        #And anything else you want to only happen when errors do
    }
)

这看起来很笨重,但有一些优点 - 如果expect_that调用产生错误,它只会打印df.orig,你可以输出......好吧,你想要的任何东西,你可以产生不同的错误与警告的结果。然而,相当粗糙。

答案 1 :(得分:0)

你可以将expect_that的结果存储在临时变量b中,检查它是否在it构造内失败并返回b

b <- expect_that(df.orig, is_identical_to(df.expected))

if (!b$passed){

    #do something
}