Отладка тестов testthat в RStudio

Можно ли вызвать отладчик в RStudio при запуске testthat тестов? Я не смог найти настройку, которая позволяла бы это (различные комбинации «использовать функции пакета devtools, если они доступны» в настройках, выбрать опцию «Проверить пакет» в меню «Сборка -> Дополнительно», запустить test() в меню консоль, вставляя browser() вызовы и т. д.), но пока не нашел способа.

Я также обнаружил, что часто теряюсь при тестировании, не зная, был ли запущенный код установлен в системных библиотеках (путем сборки и перезагрузки) или запускается на месте из локального R или что-то еще - иногда RStudio жалуется, что точка останова не может быть установлена ​​до тех пор, пока пакет не будет пересобран (поэтому я подозреваю первое) или нет (поэтому я подозреваю второе). Не уверен, что эта проблема тесно связана или нет с моим основным вопросом.

Не найдя способа заглянуть в отладчик, я заканчиваю тем, что вставляю тестовый код в консоль и работаю в очень нестандартной манере, фактически стреляя в ногу своим привычкам TDD. Поэтому любые советы будут оценены - если невозможно вызвать отладчик, какие-либо предлагаемые обходные пути?

Я запускаю RStudio версии 0.99.447 на OS X в локальном режиме с R 3.2.1.

Изменить. Мне также хотелось бы узнать больше о параметрах, например «Вариант X никогда не будет поддерживать отладку, потому что он работает в разветвленном процессе, попробуйте вместо этого другой вариант Y».

Обновление. Не получив здесь ответов, я также задал вопрос по адресу https://support.rstudio.com/hc/communities/public/questions/204779797-Debugging-testthat-tests-in-RStudio (где я также не были ответы).


person Ken Williams    schedule 21.07.2015    source источник


Ответы (2)


Для меня работает следующее:

  1. Вставьте вызов browser() где-нибудь в testthat модульных тестов.
  2. Запустите devtools::test() из консоли RStudio (вместо использования пункта меню «Тестовый пакет» в пользовательском интерфейсе)

Затем, когда программа запуска теста выполнит вызов browser(), вы сможете использовать обозреватель среды и выполните код.

Я не нашел способа заставить testthat останавливаться в точках останова, но вставка browser() вызовов является довольно близкой заменой.

Чтобы быть абсолютно уверенным, что вы начинаете с согласованного состояния, когда дело доходит до загрузки пакетов, вы можете закрыть RStudio, снова открыть его, запустить «Очистить и перестроить», а затем devtools::test()

Наконец, если вы работаете с пакетом RStudio, вы можете ознакомиться со следующими советами из Поддержка RStudio:

Для эффективной отладки в вашем пакете вы также должны убедиться, что ваш пакет скомпилирован с параметром --with-keep.source. Этот параметр используется по умолчанию для новых пакетов в RStudio; если вам нужно установить его вручную, его можно найти в Инструменты -> Параметры проекта -> Инструменты сборки.

person alev    schedule 04.08.2015
comment
Под очисткой и перестройкой вы подразумеваете сборку и перезагрузку? Что я действительно ненавижу в этом, так это то, что я часто случайно устанавливаю свою версию для разработки глобально на машину, делая это. dev_mode - одно из решений, но иногда я тоже забываю включить его, так как это ручной процесс... - person Ken Williams; 04.08.2015
comment
Я тоже не решаюсь использовать метод browser() — недавно кто-то из моей команды (к счастью, не я!) оставил кучу операторов browser() в своем коде, который пошел в производство, что было плохо. Обидно менять код только для того, чтобы тщательно его изучить. Хотя в этом случае не так уж плохо делать это в тестовых файлах - почему-то при использовании devtools::test() точки останова не работают в тестовых файлах, но они работают в файлах кода в каталоге R/. - person Ken Williams; 04.08.2015
comment
Нет, есть отдельная команда «Очистить и перестроить», которая, насколько я могу судить, аналогична «Сборке и перезагрузке», но выполняет некоторую первоначальную очистку, чтобы перейти в более предсказуемое состояние. - person alev; 04.08.2015
comment
Кроме того, исходя из следующих обсуждений, похоже, что отсутствие поддержки точек останова в тесте — известная проблема, но еще не исправленная на момент написания этой статьи: обсуждение 1, обсуждение 2 - person alev; 04.08.2015
comment
Круто, спасибо за наводку. Я добавил ссылку на github.com/hadley/testthat/pull/117. . - person Ken Williams; 04.08.2015
comment
Возвращаясь к старой теме - я больше никогда не использую Clean and Rebuild или Build and Reload. Я использую только «Загрузить все», это быстро и не устанавливается глобально. Документ также необходим иногда, если импорт необходимо скорректировать. - person Ken Williams; 24.09.2019
comment
Я попытался следовать вашим предложениям с помощью browser(), но тест, который все еще не останавливается на контрольных точках, установлен --with-keep.source. Пробовал повторно открывать RStudio и запускать «Очистить и восстановить», но безрезультатно. Вы случайно не знаете, что это еще может быть? - person schatten; 09.10.2019
comment
Ошибка в loadNamespace(name): нет пакета под названием «devtools». - person Matthaeus Gaius Caesar; 18.05.2021

Если вы хотите использовать контрольные точки редактора из RStudio для отладки модульных тестов, вы можете сделать это, обойдя testthat. Как сказал Хэдли в выпуске Github, testthat обычно запускается в отдельном сеансе от RStudio, поэтому он никогда не сможет использовать точки останова редактора. Однако сами тесты представляют собой вызовы функций с двумя аргументами: описанием и кодом. Вы можете прочитать их и запустить с помощью небольшого кода.

testf_trace <- function(filename, match) {
  env <- new.env()

  test_that <- function(desc, code) {
    if (length(grep(match, desc)) > 0) {
      eval(substitute(code), env)
    }
  }
  env$test_that <- test_that
  source(filename, env)
}

Если у вас есть тест, который читает test_that("invariant is true", { f(3) == 6 }), вы можете проверить это, запустив testf_trace(filename, "is true").

Если вы не уверены, где определена функция и, следовательно, сработает ли точка останова, вы можете узнать это, набрав имя функции в консоли. Последняя строка или две сообщат вам, в какой среде определена функция, если она была определена в среде, отличной от .Global.

person Drew D.    schedule 03.09.2020
comment
Так приятно, что это мое первое сообщение. Спасибо, что нашли время. - person Drew D.; 04.09.2020