20

运行测试时是否可以在 RStudio 中调用调试器testthat?我还没有找到一个允许这个的设置(在devtools设置中“使用包功能,如果可用”的各种组合,点击“构建 - >更多”菜单中的“测试包”选项,test()在控制台中运行,打电话browser()等),但还没有找到方法。

我还发现自己在测试时迷失了很多,不确定正在运行的代码是否已安装在系统库中(通过执行“构建和重新加载”),或者正在从本地目录原位R运行,或者是什么 - 有时是 RStudio抱怨在重建包之前无法设置断点(所以我怀疑前者)或没有(所以我怀疑后者)。不确定这个问题是否与我的主要问题密切相关。

在没有找到进入调试器的方法的情况下,我最终将测试代码粘贴到控制台中并以一种非常临时的方式工作,并且基本上将我的 TDD 习惯放在脚下。因此,任何建议都将不胜感激 - 如果无法调用调试器,有什么建议的解决方法吗?

我在 OS X 上运行 RStudio 版本 0.99.447,在本地模式下,使用 R 3.2.1。

编辑- 我也很想了解有关选项的更多背景信息,例如“选项 X 永远不会支持调试,因为它在分叉进程中运行,请尝试使用其他选项 Y。”

更新- 这里没有回复,我还在https://support.rstudio.com/hc/communities/public/questions/204779797-Debugging-testthat-tests-in-RStudio询问(我也没有回应)。

4

2 回答 2

24

以下对我有用:

  1. browser()在测试单元测试的某个地方插入一个调用。
  2. devtools::test()从 RStudio 控制台运行(而不是使用 UI 中的“测试包”菜单项)

然后,当测试运行程序点击browser()调用时,您应该能够使用环境浏览器并单步执行代码。

我还没有找到让 testthat 在断点处停止的方法,但是插入browser()调用是一个非常接近的替代品。

为了确保在加载包时从一致状态开始,您可以关闭 RStudio,重新打开它,运行“清理并重建”,然后devtools::test()

最后,如果您正在使用 RStudio 包,您可能需要查看来自RStudio 支持的以下建议:

为了在你的包中有效地调试,你还需要确保你的包是用 --with-keep.source 选项编译的。此选项是 RStudio 中新包的默认选项;如果需要手动设置,可以在工具 -> 项目选项 -> 构建工具中找到。

于 2015-08-04T01:02:24.700 回答
4

如果你想使用 RStudio 中的编辑器断点来调试单元测试,你可以通过解决testthat. 正如 Hadley 在 Github issue 中所说,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 以外的环境中定义的。

于 2020-09-03T04:46:21.250 回答