首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试脚本如何通知R检查它是否应该发出自定义消息?

测试脚本如何通知R检查它是否应该发出自定义消息?
EN

Stack Overflow用户
提问于 2010-04-29 13:29:02
回答 2查看 1.6K关注 0票数 31

我正在办公室写一个R包(delftfews)。我们使用svUnit进行单元测试。

我们描述新功能的过程:定义新的单元测试,最初标记为DEACTIVATED;每次激活一个测试块,并实现测试描述的功能。几乎所有的时间我们都有少量的停用测试,相对于可能被删除或将被实现的函数。

我的问题/问题是:我是否可以修改doSvUnit.R,以便R CMD check pkg发出一个便条(即一个自定义消息" NOTE“而不是"OK"),以防出现停用的测试?

到目前为止,我们只看到活动测试没有出现错误:

代码语言:javascript
复制
.
.
* checking for unstated dependencies in tests ... OK
* checking tests ...
  Running ‘doSvUnit.R’
 OK
* checking PDF version of manual ... OK

如果所有的测试都成功了,这是好的,但是如果有跳过的测试,那么就不太好了,如果有失败的测试,则肯定是错误的。在这种情况下,我实际上希望看到这样的便条或警告:

代码语言:javascript
复制
.
.
* 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调用调用测试目录中的脚本,
  • 输出(stdout和stderr)转到一个文件,
  • 有两种可能的结果:oknot

因此,我在R上打开了一个变更请求,提出了一些类似于对返回状态进行位编码的方法,位-0表示错误(现在是这样),位-1表示警告,位-2表示注意事项。

通过我的修改,可以很容易地生成这个输出:

代码语言:javascript
复制
.
.
* 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 ... OK

Brian回答说:“然而,有几个包有适当编写的单元测试,可以根据需要发出信号。请在其他地方讨论:r-bug不是问问题的地方。”并关闭了变更请求。

有人有暗示吗?

EN

回答 2

Stack Overflow用户

发布于 2011-11-06 16:43:53

您应该能够修改doSvUnit.R脚本,以便按照您的描述至少发出警告和错误。您要做的是运行测试,然后检查测试运行程序的返回值,并拥有调用、警告()或stop()的R代码。

有关如何使用RUnit完成此操作的示例,请查看生物导体存储库中的codetoolsBioC包。相关代码在inst/模板中,并复制如下:

代码语言:javascript
复制
.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
}
票数 1
EN

Stack Overflow用户

发布于 2011-10-12 09:13:24

我联系了forge和CRAN的两位维护人员,他们向我指出了R的来源,特别是check.R脚本。

如果我正确理解的话:

  • 使用system调用调用测试目录中的脚本,
  • 输出(stdout和stderr)转到一个文件,
  • 有两种可能的结果:oknot
  • 要回答这个问题,我们需要修补库/工具包。

我在R上打开了一个变更请求,我的第一个猜测是类似于位编码返回状态,位-0表示错误(就像现在一样),位-1表示警告,位-2表示注意。

在doSvUnit.R中,我会在发生故障时使用status 2,在跳过测试时使用4。

这个补丁应该是这样的:

代码语言:javascript
复制
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不同的东西视为错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2737680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档