2015-03-26 13 views
6

Tôi đang viết một kịch bản mà cuối cùng trả về một khung dữ liệu. Câu hỏi của tôi là xung quanh nếu có bất kỳ thực hành tốt về cách sử dụng một gói thử nghiệm đơn vị để đảm bảo rằng khung dữ liệu được trả về là chính xác. (Tôi là một lập trình viên R bắt đầu, cộng thêm mới để các khái niệm về kiểm tra đơn vị)Làm thế nào để viết một bài kiểm tra đơn vị testthat cho một hàm trả về một khung dữ liệu

Kịch bản của tôi có hiệu quả trông giống như sau:

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

... và tôi cuối cùng kết thúc với một khung dữ liệu với nhiều cột mới. Tuy nhiên, cách tiếp cận tốt nhất để kiểm tra xem khung dữ liệu được tạo ra là cái gì được dự đoán, sử dụng các xét nghiệm đơn vị?

Cho đến nay tôi đã tạo các kiểm tra đơn vị kiểm tra kết quả của từng chức năng, nhưng tôi muốn đảm bảo rằng tất cả các chức năng này cùng nhau tạo ra những gì được dự định. Tôi đã xem Hadley Wickham's page on testing nhưng không thể thấy bất kỳ điều gì rõ ràng về việc cần làm khi trả lại khung dữ liệu.

những suy nghĩ của tôi cho đến nay là:

  • Tạo một khung dữ liệu dự kiến ​​bằng tay
  • Kiểm tra xem đầu ra bằng khung dữ liệu này, sử dụng expect_that hoặc tương tự

Bất kỳ suy nghĩ/gợi ý về nơi để tìm hướng dẫn? Google-fu của tôi đã cho phép tôi giảm đáng kể về điều này cho đến nay.

+3

Giống như [này] (https://github.com/hadley/dplyr/blob/master/tests/testthat/test-colwise.R)? – Roland

Trả lời

5

Trực giác của bạn có vẻ chính xác. Xây dựng một data.frame theo cách thủ công dựa trên đầu ra dự kiến ​​của hàm và sau đó so sánh nó với đầu ra của hàm.

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

Nếu data.frame của bạn có thể không giống hệt, bạn cũng có thể chạy thử nghiệm trong các bộ phận của data.frame, bao gồm:

  • dim(outdat), để kiểm tra xem kích thước là đúng
  • attributes(outdat) hoặc các thuộc tính của cột
  • sapply(outdat, class), để kiểm tra các lớp học biến
  • summa thống kê ry cho các biến, nếu áp dụng
  • và vân vân
1

Nếu bạn muốn thử nghiệm này trong thời gian chạy, bạn nên kiểm tra xuất sắc ensurer gói, xem here. Ở dưới cùng của trang, bạn có thể xem cách xây dựng một mẫu mà bạn có thể kiểm tra khung dữ liệu của mình, bạn có thể làm cho nó chi tiết và cụ thể như bạn muốn.

0

Tôi chỉ sử dụng một cái gì đó như thế này

d1 <- iris 
d2 <- iris 
expect_that(d1, equals(d2)) # passes 
d3 <- iris 
d3[141,3] <- 5 
expect_that(d1, equals(d3)) # fails 
Các vấn đề liên quan