2012-02-27 7 views
9

Tôi đang phát triển một gói mới và tôi có một số thử nghiệm đơn vị để viết. Sự khác nhau giữa tests/inst/tests/ là gì? Những thứ gì nên đi vào trong mỗi loại?Sự khác biệt giữa các thử nghiệm/và inst/test/đối với gói R

Đặc biệt, tôi thấy trong http://journal.r-project.org/archive/2011-1/RJournal_2011-1_Wickham.pdf rằng Hadley khuyến cáo sử dụng inst/tests/ "vì vậy người dùng cũng có quyền truy cập đối với họ", sau đó đặt một tài liệu tham khảo trong tests/ để chạy chúng tất cả. Nhưng tại sao không chỉ đặt tất cả chúng trong tests/?

Trả lời

9

@hadley nghĩa là gì trong gói nhị phân, tests/ không có mặt; nó chỉ nằm trong gói nguồn. Quy ước là bất cứ điều gì trong inst/ được sao chép vào thư mục cấp cao nhất của gói khi cài đặt, vì vậy inst/tests/ sẽ có sẵn dưới dạng /tests trong cấu trúc thư mục gói nhị phân và được cài đặt.

Xem ví dụ permute của mình làm ví dụ. Tôi đã sử dụng gói dịch vụ testthat của hadley như một trải nghiệm học tập và cho các bài kiểm tra gói của tôi. Gói hàng nằm trên CRAN. Lấy tarball nguồn và thông báo rằng nó có cả hai tests/inst/tests/, sau đó lấy nhị phân Windows và thông báo rằng chỉ có tests/ và đó là một bản sao của một từ inst/tests trong các nguồn.

Nghiêm ngặt, chỉ tests/ được điều hành bởi R CMD check v.v. vì vậy trong quá trình phát triển và kiểm tra gói sản xuất bạn cần mã số tests/ để kiểm tra gói. Tất nhiên bạn có thể có mã trong tests/ chạy các tập lệnh R trong /inst/tests/ thực sự thực hiện các kiểm tra, điều này có tác dụng phụ cũng làm cho mã kiểm tra có sẵn cho người dùng gói.

Cách tôi thấy mọi thứ là bạn cần ít nhất tests/, cho dù bạn cần inst/tests sẽ phụ thuộc vào cách bạn muốn phát triển gói của mình và mã/gói kiểm tra đơn vị bạn đang sử dụng. Các inst/tests/ là một cái gì đó @hadley ủng hộ nhưng nó là xa là một tiêu chuẩn trên nhiều CRAN.

+0

Ồ, tôi hiểu rồi - Tôi nghĩ các bài kiểm tra/tôi đã thấy thực sự là các bài kiểm tra/từ nhà phát triển. Tôi đã không nhận ra nó là inst/tests /. Cảm ơn. –

+1

Vâng, chúng ta hãy lấy đoạn thứ tư với một số muối. Điều này thực sự trở lại những gì Martin Maechler đã nấu chín, ban đầu cho một số gói Rmetrics. 'inst/tests' đã được sử dụng * năm * trước khi testthat được viết. –

+0

@DirkEddelbuettel Cảm ơn bài học lịch sử; không biết điều này là do Martin. Vẫn đứng đó; điều này là xa tiêu chuẩn, ngay cả khi cả Martin * và * Hadley sử dụng nó ;-) –

5

Khi 'Viết tiện ích mở rộng R' cho biết, chỉ inst/tests được cài đặt. Vì vậy, chỉ những người có thể được sử dụng để thử nghiệm cho cả hai các phiên bản nguồn của gói và biểu mẫu nhị phân (đã cài đặt) của nó.

Nếu không, tests/ đương nhiên là có các thử nghiệm thông thường R CMD check. Bây giờ, Martin Maechler đã từng phát triển một kịch bản 'móc' từ tests/ để sử dụng inst/tests và tôi đã sử dụng nó trong một số gói của mình, cho phép chúng được gọi khi người dùng nhìn vào nguồn, cũng như sau sự kiện. Vì vậy, bạn có thể trong thực tế trục ra khỏi một bộ kiểm tra vào khác, và nhận được tốt nhất của cả hai thế giới.

Edit: Dưới đây là một liên kết đến những gì gói RProtoBuf của chúng tôi thực hiện để gọi inst/kiểm tra/kiểm tra từ các bài kiểm tra /: https://github.com/eddelbuettel/rprotobuf/blob/master/tests/runUnitTests.R Và ý tưởng cơ bản là do Martin như tôi đã nói.

+0

Cảm ơn. Tôi đã tìm kiếm "kịch bản kiểm tra ma túy của martin" và không tìm thấy những gì bạn đang đề cập, bạn có nhớ nó có thể ở đâu không? –

+0

Giống như Gavin, tôi có thể giới thiệu bạn đến các gói của tôi - ngoài ra tất nhiên là các gói Rmetrics trên R-Forge mà Martin đã làm. Đối với tôi, RQuantLib thực hiện điều này, và do đó, các gói Rcpp * (thậm chí còn tạo ra một họa tiết dựa trên các bài kiểm tra nhờ một số công việc tốt đẹp của Romain). –

+0

Nhờ @ neal-fultz để sửa URL ở trên. –