2015-03-26 16 views
6

Sto scrivendo uno script che alla fine restituisce un frame di dati. La mia domanda è intorno se ci sono buone pratiche su come utilizzare un pacchetto di test unitario per assicurarsi che il frame di dati che viene restituito sia corretto. (Sono un programmatore R inizio, più nuovo al concetto di unit testing)Come scrivere un test di prova dell'unità per una funzione che restituisce un frame di dati

Il mio script sembra efficace come il seguente:

# initialize data frame 
df.out <- data.frame(...) 

# function set 
function1 <- function(x) {...} 
function2 <- function(x) {...} 

# do something to this data frame 
df.out$new.column <- function1(df.out) 

# do something else 
df.out$other.new.column <- function2(df.out) 

# etc .... 

... e in ultima analisi, alla fine con un frame di dati con molte nuove colonne. Tuttavia, qual è l'approccio migliore per verificare che il frame di dati prodotto sia quello previsto, utilizzando i test unitari?

Finora ho creato test unitari che controllano i risultati di ciascuna funzione, ma voglio essere sicuro che eseguendo tutti questi insieme produca ciò che è inteso. Ho dato un'occhiata a Hadley Wickham's page on testing ma non riesco a vedere nulla di ovvio su cosa fare quando restituisco i frame di dati.

I miei pensieri fino ad oggi sono:

  • creare una cornice di dati previsto a mano
  • Verificare che l'uscita è uguale a questo frame di dati, utilizzando expect_that o simili

tutti i pensieri/indicazioni su dove cercare una guida? Il mio Google-fu mi ha deluso notevolmente su questo fino ad oggi.

+3

Come [questo] (https://github.com/hadley/dplyr/blob/master/tests/testthat/test-colwise.R)? – Roland

risposta

5

L'intuizione sembra corretta. Costruisci manualmente un data.frame in base all'output previsto della funzione e confrontalo con l'output della funzione.

# manually created data 
dat <- iris[1:5, c("Species", "Sepal.Length")] 

# function 
myfun <- function(row, col, data) { 
    data[row, col] 
} 

# result of applying function 
outdat <- myfun(1:5, c("Species", "Sepal.Length"), iris) 

# two versions of the same test 
expect_true(identical(dat, outdat)) 
expect_identical(dat, outdat) 

Se il data.frame non può essere identico , si potrebbe anche eseguire i test in alcune parti del data.frame, tra cui:

  • dim(outdat), per controllare se la dimensione è corretta
  • attributes(outdat) o attributi di colonne
  • sapply(outdat, class), per verificare classi variabili
  • summa statistiche Ry per le variabili, se applicabile
  • e così via
1

Se volete testare questa in fase di esecuzione, si dovrebbe verificare l'eccellente pacchetto di ensurer, vedere here. Nella parte inferiore della pagina puoi vedere come costruire un modello per testare il tuo dataframe, puoi renderlo dettagliato e specifico come preferisci.

0

che sto solo usando qualcosa di simile

d1 <- iris 
d2 <- iris 
expect_that(d1, equals(d2)) # passes 
d3 <- iris 
d3[141,3] <- 5 
expect_that(d1, equals(d3)) # fails