如何让R包测试仅在本地构建时运行,提交CRAN时自动跳过?
实现本地测试自动跳过CRAN检查的方法
完全可以用条件语句或配置实现,以下是几种实用方案:
1. 用testthat内置的跳过函数(最简单)
testthat包提供了skip_on_cran()函数,专门用来在CRAN检查时跳过指定测试。直接在你想跳过的测试用例或测试块前调用即可:
test_that("仅本地运行的测试", { skip_on_cran() # 这里写你的测试代码 expect_equal(my_local_function(1), 2) })
这个函数会自动检测当前是否是CRAN的检查环境,原理是检查Sys.getenv("NOT_CRAN")变量以及CRAN检查时的特定环境标记,可靠性很高。
2. 自定义环境变量控制(更灵活)
如果需要更精细的场景区分(比如本地开发、CI测试和CRAN),可以自定义环境变量:
- 本地运行测试前,设置环境变量:可以在
.Renviron文件里添加LOCAL_TESTS=TRUE,或者终端执行export LOCAL_TESTS=TRUE - 在测试用例里添加条件跳过:
test_that("仅本地运行的测试", { # 只有当LOCAL_TESTS环境变量设为TRUE时才运行 skip_if_not(Sys.getenv("LOCAL_TESTS") == "TRUE") # 测试代码 expect_true(my_complex_function()) })
这种方式适合需要灵活控制测试范围的场景,比如本地跑全量测试、CI跑核心测试、CRAN跳过特定测试。
3. 全局跳过整个测试文件
如果某个测试文件里的所有测试都不需要在CRAN上运行,可以在tests/testthat.R里添加全局判断,选择性加载测试文件:
library(testthat) library(yourpackage) # 仅在非CRAN环境下运行local-tests文件夹里的测试 if (!identical(Sys.getenv("NOT_CRAN"), "false")) { test_dir("tests/testthat/local-tests") } # 运行所有常规测试 test_dir("tests/testthat")
把仅本地运行的测试放到local-tests子文件夹里,CRAN检查时会自动跳过这个文件夹的测试。
内容的提问来源于stack exchange,提问作者Karolis Koncevičius
相关产品推荐
相关产品推荐

