如何为 returns 数据框的函数编写单元测试
How to write a testthat unit test for a function that returns a data frame
我正在编写一个最终 returns 数据框的脚本。我的问题是关于如何使用单元测试包来确保返回的数据框是正确的,是否有任何好的做法。 (我是 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 在这方面让我很失望。
您的直觉似乎是正确的。根据函数的预期输出手动构造一个 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)
,检查变量类
- 变量的汇总统计数据(如果适用)
- 等等
如果您想在运行时对此进行测试,您应该查看出色的 ensurer
包,请参阅 here。在页面底部,您可以看到如何构建一个模板,您可以根据该模板测试您的数据框,您可以根据需要使其尽可能详细和具体。
我正在使用类似这样的东西
d1 <- iris
d2 <- iris
expect_that(d1, equals(d2)) # passes
d3 <- iris
d3[141,3] <- 5
expect_that(d1, equals(d3)) # fails
我正在编写一个最终 returns 数据框的脚本。我的问题是关于如何使用单元测试包来确保返回的数据框是正确的,是否有任何好的做法。 (我是 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 在这方面让我很失望。
您的直觉似乎是正确的。根据函数的预期输出手动构造一个 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)
,检查变量类- 变量的汇总统计数据(如果适用)
- 等等
如果您想在运行时对此进行测试,您应该查看出色的 ensurer
包,请参阅 here。在页面底部,您可以看到如何构建一个模板,您可以根据该模板测试您的数据框,您可以根据需要使其尽可能详细和具体。
我正在使用类似这样的东西
d1 <- iris
d2 <- iris
expect_that(d1, equals(d2)) # passes
d3 <- iris
d3[141,3] <- 5
expect_that(d1, equals(d3)) # fails