Dav*_*uer 11 unit-testing r function
问题:我正在测试我正在开发的软件包中的函数,并且想知道是否可以建议一些如何执行此操作的一般指导原则.这些功能包括大量的统计建模,转换,子集和绘图.是否有"标准"或足够的测试?
一个例子:提示我问这个问题的测试,
函数dtheta:
dtheta <- function(x) {
## find the quantile of the mean
q.mean <- mean(mean(x) >= x)
## find the quantiles of ucl and lcl (q.mean +/- 0.15)
q.ucl <- q.mean + 0.15
q.lcl <- q.mean - 0.15
qs <- c(q.lcl, q.mean, q.ucl)
## find the lcl, mean, and ucl of the vector
c(quantile(x,qs), var(x), sqrt(var(x))/mean(x))
}
Run Code Online (Sandbox Code Playgroud)
第1步:制作测试数据:
set.seed(100) # per Dirk's recommendation
test <- rnorm(100000,10,1)
Run Code Online (Sandbox Code Playgroud)
第2步:将函数的预期输出与函数的实际输出进行比较:
expected <- quantile(test, c(0.35, 0.65, 0.5))
actual <- dtheta(test)[1:3]
signif(expected,2) %in% signif(actual,2)
Run Code Online (Sandbox Code Playgroud)
第3步:也许做另一个测试
test2 <- runif(100000, 0, 100)
expected <- c(35, 50, 65)
actual <- dtheta(test2)
expected %in% signif(actual,2)
Run Code Online (Sandbox Code Playgroud)
第4步:如果是,请考虑功能'功能'
这取决于你想要测试的确切内容.在Dirks推荐svUnit
或RUnit
VitoshKa提到的包装旁边,我想添加一些东西:
replicate()
在这种情况下使用是一个很好的函数.有关数据集扩展测试的示例:在这些情况下,您希望将其视为输出?这是你期望的结果吗?不是根据你做的测试.
> test3 <- rep(12,100000) # data with only 1 value
> expected <- c(12, 12, 12)
> actual <- dtheta(test3)
Error in quantile.default(x, qs) : 'probs' outside [0,1]
> test4 <- rbinom(100000,30,0.5) # large dataset with a limited amount of values
> expected <- quantile(test4,c(0.35, 0.50, 0.65))
> actual <- dtheta(test4)
> expected %in% signif(actual,2)
[1] FALSE TRUE TRUE
> test5 <- runif(100,0,100) # small dataset.
> expected <- c(35, 50, 65)
> actual <- dtheta(test5)
> expected %in% signif(actual,2)
[1] FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
编辑:更正的代码,所以测试更有意义.
好问题.
除了设置种子等一般性之外,我建议您查看R源中的一些测试.tests/
源中的目录有很多这些; R Base中的一些软件包(如工具)也有子目录tests/
.