You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 18:47:01