Как тестовый скрипт может сообщить R CMD, что он должен выдавать пользовательское сообщение? - PullRequest
31 голосов
/ 29 апреля 2010

Я пишу пакет 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, чтобы проверить реальные результаты теста.


Я связался с двумя из сопровождающих в r-forge и CRAN, и они указали мне на источники R , в частности сценарий testing.R.

если я правильно понимаю, чтобы ответить на этот вопрос, нам нужно исправить пакет tools:

  • скрипты в каталоге тестов вызываются с помощью вызова system,
  • вывод (stdout и stderr) перейти к одному файлу,
  • возможны два результата: нормально или не хорошо ,

поэтому я открыл запрос на изменение для 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 ... OK

Брайан Рипли ответил: «Однако есть несколько пакетов с правильно написанными юнит-тестами. которые делают сигнал, как требуется. Пожалуйста, возьмите это обсуждение в другом месте: R-Bugs не место, чтобы спросить вопросы. "и закрыл запрос на изменение.


у кого-нибудь есть подсказки?

Ответы [ 2 ]

1 голос
/ 06 ноября 2011

Вы должны быть в состоянии изменить сценарий doSvUnit.R, чтобы по крайней мере выдавать предупреждения и ошибки, как вы описываете.Что вы хотите сделать, это запустить тесты, а затем проверить возвращаемое значение бегуна тестов и иметь код R, который вызывает, warning () или stop ().

В качестве примера того, как это было сделано с помощьюRUnit, взгляните на пакет codetoolsBioC в репозитории Bioconductor.Соответствующий код находится в 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
}
0 голосов
/ 12 октября 2011

Я связался с двумя из сопровождающих в r-forge и CRAN, и они указали мне на источники R , в частности сценарий check.R.

если я правильно понимаю:

  • сценарии в каталоге тестов вызываются с помощью вызова system,
  • вывод (stdout и stderr) переходят в один файл,
  • возможны два результата: ок или не ок ,
  • , чтобы ответить на этот вопрос, нам нужно пропатчить пакет library / tools.

Я открыл запрос на изменение для R, мое первое предположение - что-то вроде битового кодирования состояния возврата, бит-0 для ОШИБКИ (как сейчас), бит-1для ПРЕДУПРЕЖДЕНИЯ, бит 2 для ПРИМЕЧАНИЕ.

от doSvUnit.R, я бы quit с 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 как ОШИБКУ.

...