2015-03-26 24 views
6

Piszę skrypt, który ostatecznie zwraca ramkę danych. Moje pytanie dotyczy tego, czy istnieją dobre praktyki dotyczące korzystania z pakietu testów jednostkowych, aby upewnić się, że zwrócona ramka danych jest poprawna. (Jestem początkujący programista R, plus nowy do koncepcji testów jednostkowych)Jak napisać test tego testu jednostkowego dla funkcji zwracającej ramkę danych

Mój skrypt skutecznie wygląda następująco:

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

... i ostatecznie skończyć z ramki danych z wiele nowych kolumn. Jednak jakie jest najlepsze podejście do testowania, że ​​tworzona rama danych jest tym, co jest oczekiwane, przy użyciu testów jednostkowych?

Do tej pory stworzyłem testy jednostkowe, które sprawdzają wyniki każdej funkcji, ale chcę się upewnić, że uruchomienie wszystkich tych elementów razem daje to, co jest zamierzone. Przyjrzałem się Hadley Wickham's page on testing, ale nie widzę niczego oczywistego co zrobić po zwróceniu ramek danych.

Moje myśli do tej pory to:

  • Załóż oczekiwaną ramkę danych ręcznie
  • Sprawdź, czy wyjście równa tej ramki danych, używając expect_that lub podobnego

jakieś przemyślenia/wskaźniki na Gdzie szukać wskazówek? Moje Google-fu bardzo mnie zawiodło.

+3

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

Odpowiedz

5

Twoja intuicja wydaje się być poprawna. Ręcznie skonstruuj data.frame na podstawie oczekiwanego wyniku działania funkcji, a następnie porównaj ją z danymi wyjściowymi funkcji.

# 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) 

Jeśli data.frame nie może być identyczne, można również uruchomić testy w częściach data.frame, w tym:

  • dim(outdat), aby sprawdzić, czy rozmiar jest prawidłowy
  • attributes(outdat) lub atrybuty kolumn
  • sapply(outdat, class), aby sprawdzić o zmiennym klas
  • Summa ry statystyka dla zmiennych, jeśli dotyczy
  • itd
1

Jeśli chciałbyś przetestować to w czasie wykonywania, należy sprawdzić doskonałą ensurer pakiet patrz here. W dolnej części strony możesz zobaczyć, jak skonstruować szablon, na podstawie którego możesz przetestować swoją ramkę danych, możesz zrobić to tak szczegółowe i szczegółowe, jak chcesz.

0

Ja tylko używając coś jak ten

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