发布包含单元测试 - [R包
-
18-09-2019 - |
题
所以我决定把我的小R的功能和成包,我读/学习的如何写R扩展。
这显然抱怨的事情我不这样做的权利。量
足够的谷歌搜索后,我在这里烧了几个问题,这一个是关于测试的作风:我使用的 RUnit 和我喜欢具有测试尽可能接近的代码进行测试。这样一来,我不会忘了测试,我使用的测试作为技术文件的一部分。
例如:
fillInTheBlanks <- function(S) {
## NA in S are replaced with observed values
## accepts a vector possibly holding NA values and returns a vector
## where all observed values are carried forward and the first is
## carried backward. cfr na.locf from zoo library.
L <- !is.na(S)
c(S[L][1], S[L])[1 + cumsum(L)]
}
test.fillInTheBlanks <- function() {
checkEquals(fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)), c(1, 1, 1, 2, 3, 3, 4))
checkEquals(fillInTheBlanks(c(1, 2, 3, 4)), c(1, 2, 3, 4))
checkEquals(fillInTheBlanks(c(NA, NA, 2, 3, NA, 4)), c(2, 2, 2, 3, 3, 4))
}
但R CMD check
问题注线,像这样的:
test.fillInTheBlanks: no visible global function definition for
‘checkEquals’
和它抱怨我不记录了测试功能。
我真的不希望在测试功能添加文档和我肯定宁愿不必依赖添加到RUnit包。
你是怎么想我应该看这个问题?
解决方案
如果你把你的单元测试?你可能不希望把它们放进R
目录。更标准的做法是将它们放在inst\unitTests
。看看这个R-wiki页面有关配置。
另外,你可以指定哪些文件将在您的命名空间导出,并推而广之,应该和不应该被记录哪些功能。
除此之外,理想情况下,你应该有你的测试运行,当R CMD CHECK被调用;这就是设计的一部分。在这种情况下,你应该创建一个测试脚本调用你的测试在一个单独的tests
目录。你将需要在该脚本加载RUnit包(但你并不需要让你的包的依赖)。
编辑1:
对于自己的失败,因为它无法找到checkEquals功能:我会改变你的功能是这样的:
test.fillInTheBlanks <- function() {
require(RUnit)
checkEquals(fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)), c(1, 1, 1, 2, 3, 3, 4))
checkEquals(fillInTheBlanks(c(1, 2, 3, 4)), c(1, 2, 3, 4))
checkEquals(fillInTheBlanks(c(NA, NA, 2, 3, NA, 4)), c(2, 2, 2, 3, 3, 4))
}
这样,当调用该函数时,或者它会通知该包装则需要用户的包被加载。
编辑2:
注意,在包中的所有用户级对象应记录;如果一个包pkg中包含有“内部的”只使用用户级的对象,它应该提供一个文件PKG-internal.Rd它记录所有这样的对象,并明确指出,这些并不意味着被用户调用。例如见源在用于一个例子将R分发包的网格。需要注意的是其广泛使用的内部对象包装应该隐藏在一个命名空间的那些对象,当他们不需要进行记录(见包装命名空间)。
您可以使用pkg-internal.Rd文件作为一个选项,但如果你打算在具有许多隐藏的对象,这通常是在声明中的命名空间来处理。
其他提示
你加载RUnit
包?
您最好的选择可能是看包含使用RUnit
现有代码的包。