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

mar*_*omo 31 unit-testing r cran

我正在delftfews办公室写一个R包().我们正在svUnit用于单元测试.

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

我的问题/问题是:我可以改变doSvUnit.R,以便R CMD check pkg在有DEACTIVATED测试的情况下发出一个NOTE(即自定义消息"NOTE"而不是"OK")吗?

截至目前,我们只看到活动测试没有给出错误:

.
.
* checking for unstated dependencies in tests ... OK
* checking tests ...
  Running ‘doSvUnit.R’
 OK
* checking PDF version of manual ... OK
Run Code Online (Sandbox Code Playgroud)

如果所有测试都成功,那就没关系,但是如果有跳过的测试则没那么好,如果测试失败则肯定是错误的.在这种情况下,我实际上希望看到如下所示的NOTE或WARNING:

.
.
* 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
Run Code Online (Sandbox Code Playgroud)

截至目前,我们必须打开doSvUnit.Rout检查真实的测试结果.


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

如果我理解正确,回答这个问题我们需要修补tools包:

  • 使用system调用调用tests目录中的脚本,
  • 输出(stdout和stderr)转到一个文件,
  • 有两种可能的结果:不好,

所以我在R上打开了一个更改请求,提出类似于返回状态的位编码,ERROR的位0(现在是),WARNING的位1,NOTE的位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 ... OK
Run Code Online (Sandbox Code Playgroud)

Brian Ripley回答说:"但是有几个软件包都有正确编写的单元测试,可以根据需要发出信号.请在其他地方进行讨论:R-bugs不是提问的地方." 并关闭了更改请求.


有人有提示吗?

mar*_*omo 0

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

如果我理解正确的话:

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

我在 R 上打开了一个更改请求,我的第一个猜测是对返回状态进行位编码,bit-0 表示错误(就像现在一样),bit-1 表示警告,bit-2 表示注释。

从 doSvUnit.R 中,我会在失败的情况下quit使用status2,在跳过测试的情况下使用 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 ",
Run Code Online (Sandbox Code Playgroud)

未修补的 R 将任何与 0 不同的内容视为错误。