2015-09-01 9 views
16

Używam Hadley's testthat-based approach do automatycznego testowania mojego pakietu.Gdzie umieścić dane do testów automatycznych za pomocą testu?

W tym podejściu, jakie jest najbardziej odpowiednie miejsce do umieszczania plików z danymi testowymi? Mam na myśli pliki używane tylko przez skrypty testowe w testach/testach), ale nie przez żadne inne funkcje w R /.

Moje obecne podejście polega na umieszczeniu ich w testach/testdata, a następnie read.tabeli stamtąd względną ścieżką, a nie plikiem system.file (w celu uniknięcia konieczności instalowania pakietu w celu uruchomienia testów).

Czy udało się jak dotąd skrystalizować najlepsze praktyki?

+3

Tak, myślę, że twoje podejście do umieszczania danych w '/ tests/testdata /', a następnie ładowanie za pośrednictwem np. 'Read.csv (" ../ testdata/test1.csv ") jest lepsze. Sprawdziłem, czy dodatkowe pliki w folderze 'testdata' również zostaną skopiowane do katalogu biblioteki po zbudowaniu i zainstalowaniu pakietu z flagą' --install-tests'. Ta ostatnia jest ważna, ponieważ testy powinny być dystrybuowane z pakietem IMHO. – cryo111

+10

Używam 'inst/testdata', a następnie' system.file ("testdata", ..., package = "my_package") ' –

Odpowiedz

7
  • testy są przechowywane wewnątrz pliku, który jest poprzedzony 'test_'
  • danych są przechowywane w plikach z prefiksem 'helper_'

Katalog paczek i struktura plików:

└──pkg_name/ 
    ├── DESCRIPTION 
    ├── NAMESPACE 
    ├──.Rbuildignore 
    ├── data/ 
    ├── man/ 
    ├── R/ 
    ├── vignettes/ 
    └── tests/ 
     ├── testthat.R 
     └── testthat/ 
      └── helper_myfunc1.R 
      └── helper_myfunc2.R 
      └── test_pkg_name.R 

testthat.R

library(testthat) 
library(pkg_name) 
test_check("pkg_name") 

helper_myfunc1.R zawiera dane dla funkcji badania myfunc1

a1 <- 2 
a2 <- 2 
b1 <- 2*3 
b2 <- 6 

helper_myfunc2.R zawiera dane dla funkcji badania myfunc2

c1 <- 50/2 
c2 <- 25 
d1 <- c(2,3) 
d2 <- c(2,3) 

test_pkg_name.R zawiera testy dla funkcji i innych obiektów w pakiecie

context('pkg_name_functions') 

test_that('myfunc1', 
      { 
      expect_identical(a1, a2) 
      expect_identical(b1, b2) 
      }) 

test_that('myfunc2', 
      { 
      expect_identical(c1, c2) 
      expect_identical(d1, d2) 
      }) 

Prowadzenie testów jednostkowych

library("devtools") 

devtools::load_all() 
# Loading pkg_name 

devtools::test() 
# Loading pkg_name 
# Testing pkg_name 
# pkg_name_functions: .... 

# DONE ================================================================ 
+1

jak określić swój skrypt testowy test_pkg_name.R gdzie są dane? Ponieważ Twoja odpowiedź brzmi teraz, powinieneś otrzymać błąd, który np. nie można znaleźć a1 (zakładając, że uruchamiasz bezpośrednio 'devtools :: test()' bez 'devtools :: load_all()'? Często testuję tylko tak, jak sugeruje Hadley na jego prostej ilustracji (workflow) (http: // r-pkgs.had.co.nz/tests.html) – Triamus

4

Data chapter z tej samej książki R-PKGS mówi „to jest ok umieszczać małe pliki bezpośrednio w twoim katalogu testowym ". Tak właśnie robiłem w przeszłości. Wygląda na to, że właśnie to robisz, a także katalog testdata.

4

podnoszenia z Ben Bolker za komentarze:

używam inst/testdata a następnie system.file("testdata",...,package="my_package")

Zaletą tej metody:

  • można zachować strukturę plików schludny , zwłaszcza jeśli masz wiele plików danych i/lub testów.
  • Fakt, że pliki w inst są zainstalowane, jest od dawna kanonicznym ćwiczeniem R; wydaje się bezpieczniejsze, że system.file("testdata", "some_file") zawsze będzie działać, niż zrobi to ../testdata/some_file. Podczas wykonywania R CMD check miałem złe doświadczenia przy użyciu względnych ścieżek plików.
  • W przeciwieństwie do odpowiedzi Sathisha, nie zależy to od tego, czy twoje dane są "przechowywane" jako kod R.
Powiązane problemy