【问题标题】:How to write a testthat unit test for a function that returns a data frame如何为返回数据帧的函数编写单元测试
【发布时间】:2015-05-30 17:41:17
【问题描述】:

我正在编写一个最终返回数据框的脚本。我的问题是关于如何使用单元测试包来确保返回的数据帧是正确的,是否有任何好的做法。 (我是一名初级 R 程序员,对单元测试的概念还很陌生)

我的脚本实际上如下所示:

# initialize data frame
df.out <- data.frame(...)

# function set
function1 <- function(x) {...}
function2 <- function(x) {...}

# do something to this data frame
df.out$new.column <- function1(df.out)

# do something else
df.out$other.new.column <- function2(df.out)

# etc ....

...我最终得到一个包含许多新列的数据框。但是,使用单元测试来测试生成的数据帧是否符合预期的最佳方法是什么?

到目前为止,我已经创建了检查每个函数结果的单元测试,但我想确保将所有这些一起运行会产生预期的结果。我查看了Hadley Wickham's page on testing,但在返回数据帧时看不到任何明显的内容。

到目前为止,我的想法是:

  • 手动创建预期的数据框
  • 使用expect_that 或类似方法检查输出是否等于该数据帧

关于在哪里寻找指导的任何想法/指示?迄今为止,我的 Google-fu 在这方面让我非常失望。

【问题讨论】:

标签: r unit-testing testthat


【解决方案1】:

你的直觉似乎是正确的。根据函数的预期输出手动构造一个 data.frame,然后将其与函数的输出进行比较。

# manually created data
dat <- iris[1:5, c("Species", "Sepal.Length")]

# function
myfun <- function(row, col, data) {
    data[row, col]
}

# result of applying function
outdat <- myfun(1:5, c("Species", "Sepal.Length"), iris)

# two versions of the same test
expect_true(identical(dat, outdat))
expect_identical(dat, outdat)

如果您的 data.frame 可能相同,您还可以在 data.frame 的某些部分运行测试,包括:

  • dim(outdat),检查大小是否正确
  • attributes(outdat) 或列的属性
  • sapply(outdat, class),检查变量类
  • 变量的汇总统计数据(如果适用)
  • 等等

【讨论】:

    【解决方案2】:

    如果您想在运行时对此进行测试,您应该查看出色的 ensurer 包,请参阅 here。在页面底部,您可以看到如何构建可以测试数据框的模板,您可以根据自己的喜好将其设置得尽可能详细和具体。

    【讨论】:

      【解决方案3】:

      我只是在使用类似的东西

      d1 <- iris
      d2 <- iris 
      expect_that(d1, equals(d2)) # passes
      d3 <- iris
      d3[141,3] <- 5
      expect_that(d1, equals(d3)) # fails
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        • 1970-01-01
        • 2016-01-27
        相关资源
        最近更新 更多