31

私はdelftfewsここオフィスでRパッケージ()を書いています。svUnitユニットテストに使用しています。

DEACTIVATED新しい機能を説明するためのプロセス:最初は;とマークされた新しい単体テストを定義します。一度に1ブロックのテストをアクティブにして、テストで説明されている機能を実装します。ほとんどの場合、削除される可能性のある、または実装される可能性のある関数に比べて、少量のDEACTIVATEDテストがあります。

私の問題/質問は次のとおりです。非アクティブ化されたテストがある場合にNOTE(つまり「OK」ではなくカスタムメッセージ「NOTE」)を 発行するようにdoSvUnit.Rを変更できますか?R CMD check pkg

現在のところ、アクティブなテストでエラーが発生しないことがわかります。

.
.
* 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今のところ、実際のテスト結果を確認するには、を開く必要があります。


r-forgeとCRANの2人のメンテナに連絡したところ、Rのソース、特にtesting.Rスクリプトを教えてくれました。

私がそれを正しく理解している場合、この質問に答えるには、toolsパッケージにパッチを適用する必要があります。

  • テストディレクトリ内のスクリプトは、system呼び出しを使用して呼び出されます。
  • 出力(stdoutおよびstderr)は1つのファイルに移動します。
  • 2つの可能な結果があります:okまたはnot ok

そこで、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

Brian Ripleyは、「ただし、必要に応じてシグナルを送信する、適切に記述された単体テストを備えたパッケージがいくつかあります。このディスカッションは他の場所で行ってください。R-bugsは質問をする場所ではありません。」変更リクエストを閉じました。


誰かヒントがありますか?

4

2 に答える 2

1

doSvUnit.R スクリプトを変更して、説明したように少なくとも警告とエラーを発生させることができるはずです。やりたいことは、テストを実行してから、テスト ランナーの戻り値を検査し、warning() または stop() を呼び出す R コードを用意することです。

これが RUnit を使用してどのように行われたかの例については、Bioconductor リポジトリの codetoolsBioC パッケージを見てください。関連するコードは inst/templates にあり、以下にコピーされます。

.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-11-06T16:43:53.993 に答える
0

r-forge と CRAN の 2 人のメンテナーに連絡したところ、彼らは R のソース、特にcheck.Rスクリプトを教えてくれました。

私がそれを正しく理解していれば:

  • tests ディレクトリ内のスクリプトは、system呼び出しを使用して呼び出されます。
  • 出力 (stdout および stderr) は 1 つのファイルに出力されます。
  • 2 つの可能な結果があります: okまたはnot ok
  • この質問に答えるには、ライブラリ/ツール パッケージにパッチを適用する必要があります。

私は R で変更要求を開きました。私の最初の推測では、リターン ステータスをビット コーディングするようなものです。エラーの場合はビット 0 (現在の状態)、警告の場合はビット 1、注意の場合はビット 2 です。

doSvUnit.R から、失敗の場合は 2、スキップされたテストの場合は 4 としますquitstatus

パッチは次のようになります。

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 以外のものをエラーとして認識します。

于 2011-10-12T09:13:24.380 に答える