2015-09-01 23 views
16

Sto usando Hadley's testthat-based approach per il test automatico del mio pacco.Dove inserire i dati per i test automatici con test?

All'interno di questo approccio, qual è il posto più adatto per inserire i file di dati di test? Intendo file usati solo dagli script di test in test/testthat), ma non da altre funzioni in R /.

Il mio attuale approccio è di metterli in test/testdata, e quindi read.table da lì con un percorso relativo piuttosto che con system.file (in modo da evitare la necessità di installare il pacchetto per eseguire test).

Le migliori pratiche sono state cristallizzate finora?

+3

Sì, penso che il tuo approccio con l'inserimento dei dati in '/ tests/testdata /' e quindi il caricamento tramite, ad esempio, 'read.csv (" ../ testdata/test1.csv ")' sia migliore. Ho controllato che anche i file extra nella cartella 'testdata' vengano copiati nella directory della libreria dopo aver creato e installato il pacchetto con flag' --install-tests'. Quest'ultimo è importante perché i test dovrebbero essere distribuiti con il pacchetto IMHO. – cryo111

+10

Uso 'inst/testdata' e poi' system.file ("testdata", ..., package = "my_package") ' –

risposta

7
  • test sono custoditi all'interno di un file che è prefisso 'test_'
  • dati sono conservati all'interno di file con prefisso 'helper_'

Directory dei pacchetti e struttura dei file:

└──pkg_name/ 
    ├── DESCRIPTION 
    ├── NAMESPACE 
    ├──.Rbuildignore 
    ├── data/ 
    ├── man/ 
    ├── R/ 
    ├── vignettes/ 
    └── tests/ 
     ├── testthat.R 
     └── testthat/ 
      └── helper_myfunc1.R 
      └── helper_myfunc2.R 
      └── test_pkg_name.R 

testthat.R

library(testthat) 
library(pkg_name) 
test_check("pkg_name") 

helper_myfunc1.R contiene i dati per la funzione test MyFunc1

a1 <- 2 
a2 <- 2 
b1 <- 2*3 
b2 <- 6 

helper_myfunc2.R contiene i dati per la funzione test myfunc2

c1 <- 50/2 
c2 <- 25 
d1 <- c(2,3) 
d2 <- c(2,3) 

test_pkg_name.R contiene i test per le funzioni e altri oggetti nel pacchetto

context('pkg_name_functions') 

test_that('myfunc1', 
      { 
      expect_identical(a1, a2) 
      expect_identical(b1, b2) 
      }) 

test_that('myfunc2', 
      { 
      expect_identical(c1, c2) 
      expect_identical(d1, d2) 
      }) 

unit test condotta

library("devtools") 

devtools::load_all() 
# Loading pkg_name 

devtools::test() 
# Loading pkg_name 
# Testing pkg_name 
# pkg_name_functions: .... 

# DONE ================================================================ 
+1

come si dice allo script di test test_pkg_name.R dove si trovano i dati? Poiché la tua risposta è ora, dovresti ricevere un errore che, ad es. non è stato possibile trovare a1 (supponendo di eseguire direttamente 'devtools :: test()' senza 'devtools :: load_all()'? Spesso eseguo il test solo come suggerito da Hadley nella sua semplice [illustrazione del flusso di lavoro] (http: // r-pkgs.had.co.nz/tests.html) – Triamus

4

La Data chapter dello stesso libro R-Pkgs dice "è ok mettere piccoli file direttamente nella directory di test ". Questo è quello che ho fatto in passato. E sembra che sia quello che stai già facendo, oltre alla directory testdata.

4

Sollevamento da commenti di Ben Bolker:

uso inst/testdata e poi system.file("testdata",...,package="my_package")

Il vantaggio di questo metodo:

  • è possibile mantenere la struttura di file ben , soprattutto se hai molti file di dati e/o test.
  • Il fatto che i file in inst siano installati è pratica canonica R di vecchia data; sembra più sicuro che lo system.file("testdata", "some_file") funzioni sempre di quello che lo farà ../testdata/some_file. Ho avuto esperienze negative durante l'utilizzo di percorsi di file relativi quando esegui R CMD check.
  • A differenza della risposta di Sathish, non dipende dal fatto che i dati vengano "memorizzati" come codice R.
Problemi correlati