我正在办公室写一个R包(delftfews)。我们使用svUnit进行单元测试。
我们描述新功能的过程:定义新的单元测试,最初标记为DEACTIVATED;每次激活一个测试块,并实现测试描述的功能。几乎所有的时间我们都有少量的停用测试,相对于可能被删除或将被实现的函数。
我的问题/问题是:我是否可以修改doSvUnit.R,以便R CMD check pkg发出一个便条(即一个自定义消息" NOTE“而不是"OK"),以防出现停用的测试?
到目前为止,我们只看到活动测试没有出现错误:
.
.
* checking for unstated dependencies in tests ... OK
* checking tests ...
Running ‘doSvUnit.R’
OK
* checking PDF version of manual ... OK如果所有的测试都成功了,这是好的,但是如果有跳过的测试,那么就不太好了,如果有失败的测试,则肯定是错误的。在这种情况下,我实际上希望看到这样的便条或警告:
.
.
* checking for unstated dependencies in tests ... OK
* checking tests ...
Running ‘doSvUnit.R’
NOTE
6 test(s) were skipped.
WARNING
1 test(s) are failing.
* checking PDF version of manual ... OK到目前为止,我们必须打开doSvUnit.Rout来检查真正的测试结果。
我联系了forge和CRAN的两位维护人员,他们向我指出了R的来源,特别是testing.R脚本。
如果我理解正确,要回答这个问题,我们需要修补tools包:
system调用调用测试目录中的脚本,因此,我在R上打开了一个变更请求,提出了一些类似于对返回状态进行位编码的方法,位-0表示错误(现在是这样),位-1表示警告,位-2表示注意事项。
通过我的修改,可以很容易地生成这个输出:
.
.
* checking for unstated dependencies in tests ... OK
* checking tests ...
Running ‘doSvUnit.R’
NOTE - please check doSvUnit.Rout.
WARNING - please check doSvUnit.Rout.
* checking PDF version of manual ... OKBrian回答说:“然而,有几个包有适当编写的单元测试,可以根据需要发出信号。请在其他地方讨论:r-bug不是问问题的地方。”并关闭了变更请求。
有人有暗示吗?
发布于 2011-11-06 16:43:53
您应该能够修改doSvUnit.R脚本,以便按照您的描述至少发出警告和错误。您要做的是运行测试,然后检查测试运行程序的返回值,并拥有调用、警告()或stop()的R代码。
有关如何使用RUnit完成此操作的示例,请查看生物导体存储库中的codetoolsBioC包。相关代码在inst/模板中,并复制如下:
.test <- function(dir, pattern = ".*_test\\.R$")
{
.failure_details <- function(result) {
res <- result[[1L]]
if (res$nFail > 0 || res$nErr > 0) {
Filter(function(x) length(x) > 0,
lapply(res$sourceFileResults,
function(fileRes) {
names(Filter(function(x) x$kind != "success",
fileRes))
}))
} else list()
}
if (missing(dir)) {
dir <- system.file("unitTests", package="@PKG@")
if (!nzchar(dir)) {
dir <- system.file("UnitTests", package="@PKG@")
if (!nzchar(dir))
stop("unable to find unit tests, no 'unitTests' dir")
}
}
## Run unit tests from the directory containing the test files.
## This allows tests to refer to data files with relative paths
cwd <- getwd()
on.exit(setwd(cwd))
setwd(dir)
require("RUnit", quietly=TRUE) || stop("RUnit package not found")
RUnit_opts <- getOption("RUnit", list())
RUnit_opts$verbose <- 0L
RUnit_opts$silent <- TRUE
RUnit_opts$verbose_fail_msg <- TRUE
options(RUnit = RUnit_opts)
suite <- defineTestSuite(name="@PKG@ RUnit Tests", dirs=getwd(),
testFileRegexp=pattern,
rngKind="default",
rngNormalKind="default")
result <- runTestSuite(suite)
cat("\n\n")
printTextProtocol(result, showDetails=FALSE)
if (length(details <- .failure_details(result)) >0) {
cat("\nTest files with failing tests\n")
for (i in seq_along(details)) {
cat("\n ", basename(names(details)[[i]]), "\n")
for (j in seq_along(details[[i]])) {
cat(" ", details[[i]][[j]], "\n")
}
}
cat("\n\n")
stop("unit tests failed for package @PKG@")
}
result
}发布于 2011-10-12 09:13:24
我联系了forge和CRAN的两位维护人员,他们向我指出了R的来源,特别是check.R脚本。
如果我正确理解的话:
system调用调用测试目录中的脚本,我在R上打开了一个变更请求,我的第一个猜测是类似于位编码返回状态,位-0表示错误(就像现在一样),位-1表示警告,位-2表示注意。
在doSvUnit.R中,我会在发生故障时使用status 2,在跳过测试时使用4。
这个补丁应该是这样的:
Index: src/library/tools/R/testing.R
===================================================================
--- src/library/tools/R/testing.R (revision 57214)
+++ src/library/tools/R/testing.R (working copy)
@@ -352,10 +352,16 @@
} else
cmd <- paste("LANGUAGE=C", "R_TESTS=startup.Rs", cmd)
res <- system(cmd)
- if (res) {
+ if (res%/%4 %% 2) {
+ message("NOTE")
+ }
+ if (res%/%2 %% 2) {
+ message("WARNING")
+ }
+ if (res %% 2) {
file.rename(outfile, paste(outfile, "fail", sep="."))
return(1L)
}
savefile <- paste(outfile, "save", sep = "." )
if (file.exists(savefile)) {
message(" Comparing ", sQuote(outfile), " to ",未修补的R将任何与0不同的东西视为错误。
https://stackoverflow.com/questions/2737680
复制相似问题