2016-03-22 10 views
3

Gibt es eine einfache Möglichkeit, die Ausführung einiger Tests in einem Paket zu überspringen, wenn das Paket von CRAN getestet wird? Der Hintergrund ist, ich habe gerne viele Tests und in der Summe sind sie zeitaufwendig (nicht gut für CRAN).Tests auf CRAN übersprungen, aber lokal ausgeführt

Ich weiß, es gibt testthat::skip_on_cran(), aber ich möchte Paket testthat nicht verwenden, um eine andere Abhängigkeit zu vermeiden. Ich suche nach einem el-cheapo Weg, um testthat::skip_on_cran nachzuahmen.

Im Idealfall würde Ich mag eine Testdatei im Verzeichnis haben pkg/tests, die die Tests (Testdateien) und distuingishes nennt, wenn wir auf Cran sind oder nicht:

if (!on_cran) { 
## these tests are run only locally/when not on CRAN 
# run test 1 (e.g. source a file with a test) 
# run test 2 
} 
# run test 3 - always 
+0

Verwenden Sie env var lokal definiert, oder teilen Sie Tests in mehrere Dateien auf und beenden Sie sie jeweils mit 'q (save =" no ")'. – jangorecki

Antwort

10

Ja! Sie können dies programmatisch und automatisch behandeln. Lassen Sie mich ausführlich auf zwei Arten Ich habe ein:

Implizit über Versionsnummern: Dies ist der von RCPP genommen Ansatz für viele Jahre, und es ist ganz allgemein und nicht abhängig von jedem anderen Paket . Unsere Tests beginnen mit einer Datei in tests/ und übergeben dann an RUnit, aber dieser letzte Teil ist ein Implementierungsdetail.

In der Hauptdatei tests/doRUnit.R wir dies tun:

## force tests to be executed if in dev release which we define as 
## having a sub-release, eg 0.9.15.5 is one whereas 0.9.16 is not 
if (length(strsplit(packageDescription("Rcpp")$Version, "\\.")[[1]]) > 3) { 
    Sys.setenv("RunAllRcppTests"="yes") 
} 

Im Wesentlichen wir testen, ob die Version des Formulars a.b.c.d ist - und wenn ja dem Schluss, dass es sich um eine Entwicklungsversion ist. Dies bedeutet "Alle Tests ausführen". Während eine Release-Version des Formulars a.b.c zu CRAN gehen würde und diese Tests nicht ausführen würde, da sie ihr Zeitlimit überschreiten würden.

In jedem der actual unit test files, können wir dann entscheiden, ob wir die Variable und überspringen Sie den Test ehren wollen, wenn gesetzt, oder führen Sie trotzdem:

.runThisTest <- Sys.getenv("RunAllRcppTests") == "yes" 

if (.runThisTest) { 

    ## code here that contains the tests 

} 

Dieser Mechanismus ist vollautomatisch, und hängt nicht von der Benutzer. (In der aktuellen Paketversion gibt es einen weiteren if() Test, der darin eingeschlossen ist, der uns erlaubt, die Tests zu unterdrücken, aber das ist ein Detail, das wir hier nicht brauchen).

Ich mag diesen Ansatz immer noch sehr.

Explizit über Ressourcendateien Ein anderes Paket, an dem einige von uns arbeiten (in letzter Zeit), erfordert ein bestimmtes Backend. So testen wir im Rblpapi-Paket auf das Vorhandensein einer Datei, die meine Co-Autoren und ich jeweils unter unserem Verzeichnis $HOME haben, um Anmeldeinformationen und Verbindungsdetails einzurichten. Wenn die Datei fehlt - wie z.B. Auf Travis CI oder CRAN oder für andere Benutzer werden die Tests übersprungen.

Wir entschieden uns, die Ressourcendatei als R-Datei zu verwenden; es sources it if found and thereby sets values for options(). Auf diese Weise können wir direkt steuern, ob Tests gestartet werden sollen oder nicht.

## We need to source an extra parameter file to support a Bloomberg connection 
## For live sessions, we use ~/.Rprofile but that file is not read by R CMD check 
## The file basically just calls options() and sets options as needed for blpHost, 
## blpPort, blpAutoConnect (to ensure blpConnect() is called on package load) and, 
## as tested for below, blpUnitTests. 
connectionParameterFile <- "~/.R/rblpapiOptions.R" 
if (file.exists(connectionParameterFile)) source(connectionParameterFile) 

## if an option is set, we run tests. otherwise we don't. 
## recall that we DO need a working Bloomberg connection... 
if (getOption("blpUnitTests", FALSE)) { 

    ## ... more stuff here which sets things up 

} 

Ähnlich wie beim ersten Anwendungsfall können nun weitere Variablen festgelegt werden, die später getestet werden.

Explizit über Travis CI Eine weitere Option, die wir in rfoaas verwenden ist die Umgebungsvariable regelt dies in den Travis CI file einzustellen:

env: 
    global: 
    - RunFOAASTests=yes 

die die tests script then picks up:

## Use the Travis/GitHub integrations as we set this 
## environment variable to "yes" in .travis.yml 
## 
## Set this variable manually if you want to run the tests 
## 
if (Sys.getenv("RunFOAASTests=yes") == "yes") runTests <- TRUE 

In diesem Fall I Setzen Sie auch den Schalter auf der Basis meiner Benutzer-ID, da ich so ziemlich alleine zum Projekt beitragen kann:

## Also run the tests when building on Dirk's box, even whem 
## the environment variable is not set 
if (isTRUE(unname(Sys.info()["user"])=="edd")) runTests <- TRUE 

Explizit über eine andere Variable Sie können sich natürlich auch auf eine andere Variable verlassen, die Sie für alle Ihre Pakete verwenden. Ich finde das eine schlechte Idee. Wenn Sie dies in Ihrer Shell festlegen, arbeiten Sie an Paket A und legen Sie fest, dass es Tests unterdrückt, aber dann zu Paket B wechselt - Sie werden wahrscheinlich vergessen, die Variable zu deaktivieren, und können dann nicht testen. Ich mag diesen Ansatz am wenigsten und verwende ihn nicht.

+0

Danke! Das ist sehr umfassend! Aus den angesprochenen Ansätzen gefällt mir die bisher "Implizit über Versionsnummern" am besten. Einfach weil es unter den Paketentwicklern keine "shared file/env var" benötigt. Leider haben wir (noch) kein richtiges Versionierungsschema definiert ... Ich frage mich, ob es eine direkte Möglichkeit gibt, eine gut definierte Umgebungsvariable von CRAN-Maschinen abzufragen - oder ob CRAN-Betreuer bereit sind, so etwas in Betracht zu ziehen. – Helix123

+1

In der Vergangenheit haben sie immer nein gesagt, und einige Leute auf der Mailingliste (ein bestimmtes R-Core-Mitglied, dessen Initialen _nicht_ BDR sind, fällt einem ein) sind dagegen stark. Also bezweifle ich, dass es passieren wird, weshalb ich vor Jahren auf das implizite Schema umgestiegen bin, das _just works_ ist, was wir schließlich wollen. –

+0

Als Hinweis für diejenigen, die an dem Ansatz interessiert sind, der die Versionsnummer verwendet: 'numeric_version (packageDescription (" pkg_name ") $ Version) ist sehr praktisch, wenn man nach einer bestimmten Versionsnummer, z. 'numeric_version (packageDescription (" pkg_name ") $ Version) [[1,2]]' gibt die Nebenversion als Integer an und scheint einfacher zu sein als die Stringaufteilung (und behandelt "." und "-" automatisch als Separatoren) . – Helix123

2

Verwenden Sie eine Umgebungsvariable, like testthat does:

skip_on_cran <- function() { 
    if (identical(Sys.getenv("NOT_CRAN"), "true")) { 
    return(invisible(TRUE)) 
    } 

    skip("On CRAN") 
} 
+0

Danke. Kannst du ein bisschen mehr kommentieren? Also haben CRAN-Maschinen eine Umgebungsvariable NOT_CRAN, die auf etwas anderes als "wahr" gesetzt ist? Oder soll man die eigene Umgebungsvariable NOT_CRAN auf dem lokalen Rechner auf "true" setzen? Ich würde das auf verschiedenen Maschinen von verschiedenen Leuten brauchen, also wenn letzteres erforderlich ist, würde man etwas R-Code brauchen, um die Maschine zu überprüfen ... Kennen Sie ein Paket (auf CRAN), das diese selbst gebaute Kontrolle hat? – Helix123

+0

@ Helix123 die Umgebungsvariable 'NOT_CRAN' fehlt auf CRAN. Wenn Sie Ihre Tests davon abhängig machen, werden sie nicht ausgeführt. Sie können auch einen anderen zufälligen Umgebungsvariablennamen angeben. 'NOT_CRAN' ist nur die Variable, die von testthat und devtools verwendet wird. Sie müssten dies auf jedem Computer festlegen, auf dem die Tests ausgeführt werden sollen. – Thomas

+0

Ich sehe das ein etwas "indirekter" Ansatz. Wenn es mehrere Mitwirkende zu dem Paket gibt, wird es unhandlich, da jeder das richtige Setup für seine lokale Maschine haben muss ... gibt es nicht anders? Identifizieren sich die CRAN-Maschinen irgendwie nicht, z. durch eine Umgebungsvariable, die wir verwenden könnten? Nichts ist ein Dokument in den CRAN-Richtlinien, aber es gibt "Long-running-Tests und Vignette-Code kann optional zur Überprüfung gemacht werden ..." – Helix123

Verwandte Themen