2015-07-21 21 views
8

Ist es möglich, den Debugger in RStudio beim Ausführen von testthat Tests aufzurufen? Ich konnte kein Setup finden, das dies erlaubt (verschiedene Kombinationen von "devtools Paketfunktionen, falls verfügbar" in den Einstellungen verwenden, die Option "Testpaket" im "Build -> More" Menü drücken, test() in der Konsole, setzen browser() Anrufe, etc.) aber haben noch keinen Weg gefunden.Debugging 'testthat' Tests in RStudio

ich auch finde mich viel verloren zu gehen, wenn die Prüfung, nicht sicher, ob der Code sein Lauf in den Systembibliotheken installiert wurde (by doing ‚Build & Reload‘), oder wird ausgeführt in situ aus dem lokalen R Verzeichnis, oder was - manchmal RStudio beschwert sich, dass ein Haltepunkt nicht gesetzt werden kann, bis das Paket neu aufgebaut wird (so vermute ich erstere) oder nicht (so vermute ich letzteres). Ich bin mir nicht sicher, ob dieses Problem eng mit meiner Hauptfrage zusammenhängt oder nicht.

Ohne einen Weg zu finden, um in den Debugger zu fallen, ich am Ende Einfügen von Test-Code in die Konsole & arbeiten auf eine sehr ad-hoc-Art und im Grunde schießen meine TDD Gewohnheiten in den Fuß. Daher wäre jeder Rat gefragt - wenn es nicht möglich ist, den Debugger aufzurufen, irgendwelche vorgeschlagenen Problemumgehungen?

Ich verwende RStudio Version 0.99.477 auf OS X, im lokalen Modus, mit R 3.2.1.

Bearbeiten - Ich würde auch gerne mehr Hintergrund über die Optionen, z. "Option X wird das Debuggen nie unterstützen, da es in einem gegabelten Prozess ausgeführt wird, versuchen Sie stattdessen diese andere Option Y."

Update - ich hatte keine Antworten hier, ich fragte auch bei https://support.rstudio.com/hc/communities/public/questions/204779797-Debugging-testthat-tests-in-RStudio (wo ich auch keine Antworten hatte).

Antwort

5

Die folgenden Werke für mich:

  1. einen Aufruf an browser() Legen Sie irgendwo innerhalb der testthat Unit-Tests.
  2. Run devtools::test() von der RStudio Konsole (statt dem „Test-Paket“ Menüpunkt aus der Benutzeroberfläche verwenden)

Dann, wenn der Test Runner den browser() Aufruf trifft, sollten Sie in der Lage sein, die environment browser und verwenden Schritt durch den Code.

Ich habe keine Möglichkeit gefunden, testthat an Haltepunkten zu stoppen, aber Einfügen browser() Invocations ist ein ziemlich enger Ersatz.

Um absolut sicher zu sein, dass Sie von einem konsistenten Zustand fangen, wenn es um Laden von Paketen kommen, Sie RStudio, öffnen Sie es erneut, führen Sie „Sauber und neu erstellen“ und dann devtools::test()

Schließlich schließen können, wenn Sie in einem RStudio Paket arbeiten, können Sie die folgenden Ratschläge von RStudio support zu überprüfen:

um effektiv in Ihrem Paket zu debuggen, werden Sie wollen auch sicherstellen, dass Ihr Paket mit kompiliert die Option --with-keep.source. Diese Option ist die Standardeinstellung für neue Pakete in RStudio. Wenn Sie es manuell einstellen müssen, finden Sie es unter Extras -> Projektoptionen -> Build Tools.

+0

Mit "Clean and Rebuild" meinen Sie "Build & Reload"? Was ich wirklich hasse, ist, dass ich meine Entwicklungsversion oft versehentlich auf dem Rechner global installiere. 'dev_mode' ist eine Lösung, aber manchmal vergesse ich, das auch einzuschalten, da es ein manueller Prozess ist ... –

+1

Ich zögere, die' browser() 'Methode entweder zu verwenden - vor kurzem jemand in meinem Team (nicht ich, Gott sei Dank !) hat in ihrem Code eine Menge 'browser()' Statements hinterlassen, die in die Produktion gingen, was schlecht war. Es ist ein Nachteil, den Code ändern zu müssen, nur um ihn zu hinterfragen. Obwohl es in diesem Fall nicht ganz so schlimm ist, es in den Testdateien zu tun - aus irgendeinem Grund funktionieren die Breakpoints bei der Verwendung von "devtools :: test()" nicht in den Testdateien, aber sie funktionieren in den Code-Dateien unter 'R /' Verzeichnis. –

+0

Nein, es gibt einen separaten Befehl "Clean and Rebuild", der, soweit ich das beurteilen kann, derselbe wie "Build & reload" ist, aber eine erste Bereinigung durchführt, um in einen besser vorhersagbaren Zustand zu kommen. – alev