Как тест script сообщает R CMD проверить, что он должен испускать пользовательское сообщение?
Я пишу R-пакет (delftfews
) здесь, в офисе. мы используем svUnit
для модульного тестирования.
наш процесс описания новой функциональности: мы определяем новые модульные тесты, первоначально обозначенные как DEACTIVATED
; один блок тестов за время, когда мы их активируем, и реализуем функцию, описанную в тестах. почти все время у нас есть небольшое количество тестов DEACTIVATED, относительно функций, которые могут быть отброшены или будут реализованы.
моя проблема/вопрос: могу ли я изменить doSvUnit.R, чтобы R CMD check pkg
выдавал ПРИМЕЧАНИЕ (то есть пользовательское сообщение "ПРИМЕЧАНИЕ" вместо "ОК" ) в случае, если есть тесты DEACTIVATED?
теперь мы видим только, что активные тесты не дают ошибки:
.
.
* 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
script.
Если я правильно понял, чтобы ответить на этот вопрос, нам нужно исправить пакет tools
:
- скрипты в каталоге тестов вызываются с помощью вызова
system
,
- вывод (stdout и stderr) переходят в один файл,
- возможны два возможных результата: ok или не нормально,
поэтому я открыл запрос на изменение на R, предложив что-то вроде бит-кодирования статуса возврата, бит-0 для ERROR (так как он теперь), бит-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-ошибки не являются местом, чтобы спросить
вопросов. "и закрыл запрос на изменение.
У кого-нибудь есть подсказки?
Ответы
Ответ 1
Вы должны иметь возможность изменить doSvUnit.R script, чтобы, по крайней мере, издавать предупреждения и ошибки. То, что вы хотите сделать, - запустить тесты, а затем проверить возвращаемое значение тестового бегуна и иметь код 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="@[email protected]")
if (!nzchar(dir)) {
dir <- system.file("UnitTests", package="@[email protected]")
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="@[email protected] 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 @[email protected]")
}
result
}
Ответ 2
Я связался с двумя сопровождающими в r-forge и CRAN, и они указали мне на источники R, в частности check.R
script.
если я правильно понимаю:
- скрипты в каталоге тестов вызываются с помощью вызова
system
,
- вывод (stdout и stderr) переходят в один файл,
- возможны два возможных результата: ok или не нормально,
- Чтобы ответить на этот вопрос, нам нужно исправить пакет библиотеки/инструментов.
Я открыл запрос на изменение на R, мое первое предположение - это что-то вроде бит-кодирования статуса возврата, бит-0 для ERROR (как это сейчас), бит-1 для ПРЕДУПРЕЖДЕНИЯ, бит-2 для ПРИМЕЧАНИЕ.
from 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 ",
unpatched R видит что-то отличное от 0 как ERROR.