2012-02-27 5 views
9

Sto sviluppando un nuovo pacchetto e ho alcuni test unitari da scrivere. Qual è la differenza tra tests/ e inst/tests/? Che tipo di cose dovrebbero andare in ciascuna?Differenza tra test/e inst/test/per pacchetti R

In particolare, vedo in http://journal.r-project.org/archive/2011-1/RJournal_2011-1_Wickham.pdf che Hadley consiglia di utilizzare inst/tests/ "così gli utenti anche avere accesso ad essi", poi mettere un riferimento in tests/ per eseguirli tutti. Ma perché non metterli tutti nello tests/?

risposta

9

Quello che @hadley significa è che nei pacchetti binari, tests/ non è presente; è solo nel pacchetto sorgente. La convenzione prevede che qualsiasi cosa in inst/ venga copiata nella directory di livello superiore del pacchetto al momento dell'installazione, pertanto inst/tests/ sarà disponibile come /tests nella struttura della directory del pacchetto binario e installata.

Vedere il mio pacchetto permute come esempio. Ho utilizzato il test di @ hadley come pacchetto didattico come esperienza di apprendimento e per i miei test sui pacchetti. Il pacchetto è CRAN. Prendi il tarball sorgente e nota che ha sia tests/ e inst/tests/, quindi prendi il file binario di Windows e nota che ha solo tests/ e che è una copia di quello da inst/tests nelle fonti.

Strettamente, solo tests/ viene eseguito da R CMD check ecc così durante lo sviluppo e come controlli nei pacchetti di produzione è necessario il codice in tests/ per verificare che il pacchetto esegua ciò che afferma o altri test di unità. Ovviamente è possibile avere il codice che esegue gli script R in /inst/tests/ che effettivamente eseguono i test, e. Ciò ha anche l'effetto collaterale di rendere disponibile il codice di prova per gli utenti del pacchetto.

Il modo in cui vedo le cose è che è necessario almeno tests/, se è necessario il numero inst/tests dipenderà da come si desidera sviluppare il pacchetto e da quale codice di test dell'unità/pacchetti si sta utilizzando. Lo inst/tests/ è qualcosa che @hadley sostiene, ma è ben lungi dall'essere uno standard su gran parte di CRAN.

+0

Oh, capisco - pensavo che i test/stavo vedendo erano in realtà i test/dallo sviluppatore. Non avevo capito che era inst/tests /. Grazie. –

+1

Bene, prendiamo il quarto paragrafo con un po 'di sale. Questo torna davvero a ciò che Martin Maechler ha inventato, inizialmente per alcuni pacchetti Rmetrics. 'inst/tests' era stato usato * anni * prima del test che era stato scritto. –

+0

@DirkEddelbuettel Grazie per la lezione di storia; non sapeva che questo era dovuto a Martin. Tuttavia, resta ancora in piedi; questo è lontano dallo standard, anche se sia Martin * che * Hadley lo usano ;-) –

5

Come dice "Estensioni scrittura R", viene installato solo inst/tests. Pertanto, solo quelli possono essere utilizzati per i test per sia per che per le versioni di origine del pacchetto e per il suo modulo binario (installato).

Altrimenti tests/ è ovviamente disponibile per i consueti test R CMD check. Ora, Martin Maechler ha sviluppato una volta uno script "hook" da tests/ per utilizzare inst/tests, e lo sto usando in alcuni dei miei pacchetti, consentendo loro di essere richiamati quando un utente guarda all'origine, oltre che dopo il fatto. In questo modo è possibile ruotare dall'unico insieme di test nell'altro e ottenere il meglio da entrambi i mondi.

Edit: Ecco un link a quello che il nostro pacchetto RProtoBuf fa per invocare inst/test/test da prove /: https://github.com/eddelbuettel/rprotobuf/blob/master/tests/runUnitTests.R E l'idea di base è dovuto a Martin come ho detto.

+0

Grazie. Ho cercato su google per "script di test di martin maechler" e non ho trovato quello che stai menzionando, ricordi dove potrebbe essere? –

+0

Proprio come Gavin, potrei farti riferimento ai miei pacchetti - oltre naturalmente ai pacchetti Rmetrics su R-Forge per i quali Martin ha fatto questo. Per quanto riguarda il mio, RQuantLib fa questo, e così fanno i pacchetti Rcpp * (che producono anche una vignetta basata sui test grazie ad un bel lavoro di Romain). –

+0

Grazie a @ neal-fultz per correggere l'URL sopra. –