2010-04-29 9 views
31

Sto scrivendo un pacchetto R (delftfews) qui in ufficio. stiamo usando svUnit per il test dell'unità.Come può uno script di test informare R CMD verificare che debba emettere un messaggio personalizzato?

il nostro processo per la descrizione di nuove funzionalità: definiamo nuovi test di unità, inizialmente contrassegnati come DEACTIVATED; un blocco di test alla volta li attiviamo e implementiamo la funzione descritta dai test. quasi sempre abbiamo una piccola quantità di test DISATTIVATI, relativi a funzioni che potrebbero essere abbandonate o implementate.

il mio problema/domanda è: posso modificare il doSvUnit.R in modo che R CMD check pkg emetta una NOTA (ad esempio un messaggio personalizzato "NOTA" anziché "OK") nel caso ci siano test disattivati?

fin d'ora, vediamo solo che i test attivi non danno errore:

. 
. 
* checking for unstated dependencies in tests ... OK 
* checking tests ... 
    Running ‘doSvUnit.R’ 
OK 
* checking PDF version of manual ... OK 

che è bene se tutte le prove riescono, ma meno bene se ci sono i test saltati e sicuramente sbagliato se ci sono test falliti. In questo caso, mi piacerebbe davvero piace vedere una nota o un avviso come il seguente:

. 
. 
* 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 

A partire da ora, dobbiamo aprire il doSvUnit.Rout per verificare i reali risultati del test.


ho contattato due dei manutentori a r-fucina e CRAN e mi hanno puntato il sources of R, in particolare lo script testing.R.

se ho ben capito, per rispondere a questa domanda abbiamo bisogno di patch il pacchetto tools:

  • script nella directory test sono chiamati utilizzando una chiamata system,
  • output (stdout e stderr) vai a un singolo file,
  • ci sono due possibili risultati: ok o non ok,

così ho aperto un change request su R, proponendo qualcosa come codifica a bit lo stato di ritorno, bit-0 per ERRORE (come è ora), bit-1 per AVVISO, bit-2 per NOTA.

con la mia modifica, sarebbe facile produrre questo output:.

. 
. 
* 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 risponde: "Ci sono tuttavia diversi pacchetti con unità correttamente scritto test che lo fanno segnale come richiesto Si prega di prendere questa discussione altrove: R-bugs non è il posto dove porre domande ". e ha chiuso la richiesta di modifica.


qualcuno ha suggerimenti?

+0

Cosa intendi per NOTA? Come in un suono dagli altoparlanti del computer? – I82Much

+1

domanda modificata per spiegare NOTA, opposta a OK ma non così male come AVVERTENZA. – mariotomo

+0

solo una nota: ho implementato una soluzione a un problema un po 'opposto, ovvero, essendo a conoscenza dei test unitari degli esempi nelle pagine di manuale. fa parte di svUnit. – mariotomo

risposta

0

Ho contattato due dei manutentori su r-forge e CRAN e mi hanno indirizzato verso lo sources of R, in particolare lo script check.R.

se ho capito bene:

  • script nella directory test sono chiamati utilizzando una chiamata system,
  • output (stdout e stderr) vai a un singolo file,
  • ci sono due possibili esiti: ok o non ok,
  • per rispondere a questa domanda è necessario applicare patch al pacchetto librerie/strumenti.

ho aperto un change request su R, la mia prima congettura è qualcosa di simile a bit-codifica lo stato di ritorno, bit-0 per l'errore (come è ora), bit-1 per ATTENZIONE, bit-2 per NOTA.

da doSvUnit.R, vorrei quit con status 2 in caso di guasti e 4 in caso di test saltati.

la patch sarebbe simile a questa:

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 ", 

senza patch R vede qualcosa di diverso da 0 come ERRORE.

1

Dovresti riuscire a modificare lo script doSvUnit.R per almeno emettere avvisi ed errori mentre descrivi. Quello che vuoi fare è eseguire i test e poi ispezionare il valore di ritorno del runner di test e avere il codice R che chiama, warning() o stop().

Per un esempio di come è stato fatto utilizzando RUnit, dare un'occhiata al pacchetto codetoolsBioC nel repository Bioconductor. Il codice pertinente è in inst/templates e copiato di seguito:

.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

bene, ho aggiunto a svUnit il codice che gli permette di produrre un report xml completo dei casi di test, ma io non Penso che puoi fornire il feedback che descrivo senza alterare il controllo. Se dici che dovrei essere in grado di farlo, afferra il progetto 'delftfews', al momento contiene un paio di' 'e' 'test e test la tua idea, non capisco dall'esempio che fornisci, ma grazie per l'eff ort. – mariotomo

+2

seth, hai provato cosa suggerisci? secondo me, l'output di questo va semplicemente nel log ' out', non alla console. – mariotomo

Problemi correlati