使用testthat测试未打包R代码时编译失败的排查求助
确认是否存在编译型代码
如果你的代码里包含.cpp/.c/.f这类文件,或者用到了Rcpp、inline这类需要编译的工具包,问题大概率是缺少编译环境。Windows用户需要安装Rtools,Mac用户要装Xcode Command Line Tools,安装完成后重启RStudio再重试测试。检查是否误用包命令处理非包代码
devtools::check()是专门针对R包的检查命令,如果你只是零散的R脚本加testthat测试文件,没有标准的包目录结构(比如缺少DESCRIPTION、NAMESPACE,测试文件不在tests/testthat目录下),运行这个命令肯定会报错。
解决办法:如果只是想跑测试,不用check(),直接用testthat::test_dir("你的测试文件所在目录");如果要打包交付,先按R包结构整理代码,生成DESCRIPTION文件。查看完整错误日志定位问题
RStudio测试失败后,点击错误信息里的「Show Output」,或者直接运行devtools::check(build_args = "--no-build-vignettes", quiet = FALSE),看完整的编译日志。重点关注no DLL was created之前的具体报错,比如是否有语法错误、依赖缺失的提示,这些才是问题根源。确认依赖包完整且兼容
如果代码依赖了需要编译的包(比如Rcpp),先确保这些包已经正确安装,版本也兼容。可以用sessionInfo()查看已装包版本,或者重新安装核心依赖:install.packages(c("testthat", "devtools"))(如果用到Rcpp就加上"Rcpp")。用最小示例排查问题
写个最简单的测试场景验证环境:新建func.R,内容是add <- function(a,b) a+b;再建test_add.R,内容是test_that("add works", {expect_equal(add(1,2),3)})。在RStudio里运行这个测试,如果能成功,说明问题出在你的原代码里,逐步添加原代码内容排查。检查RStudio的测试配置
打开RStudio的「Tools -> Project Options -> Build Tools」:如果不是包项目,把Build Tools类型设为「None」;如果是包项目,选「Package」,且如果没用到Roxygen生成文档,就关掉「Generate documentation with Roxygen」选项,避免冲突。
内容的提问来源于stack exchange,提问作者Andy Halper

