如何在testthat测试中复用需耗时创建的大型对象?
解决R包testthat测试中复用大对象的方案
针对你遇到的「需要复用超大对象但受CRAN限制无法存储」的问题,这里有几个实用的解决思路:
1. 单测试文件内复用:用testthat的setup()函数(testthat 3.0+)
在测试文件开头用setup()定义对象创建逻辑,这个对象会在当前文件的所有测试用例执行前生成一次,整个文件内的测试都能直接复用:
# 测试文件(如 tests/testthat/test-func.R)开头 setup({ # 这里写耗时的大对象创建代码 large_obj <- your_time_consuming_creation_function() }) test_that("功能A测试", { expect_equal(your_func(large_obj), expected_result_A) }) test_that("功能B测试", { expect_true(another_func(large_obj)) })
2. 跨测试文件复用:用测试启动脚本
如果多个测试文件都需要这个大对象,可以在tests/testthat/目录下创建setup.R脚本——这个脚本会在整个测试套件启动前执行一次,所有测试文件都能访问其中创建的对象:
- 新建
tests/testthat/setup.R文件 - 在脚本内创建大对象:
# setup.R 内容 large_obj <- your_time_consuming_creation_function()
之后所有测试文件里的用例都可以直接调用large_obj,全程只创建一次,测试结束后自动销毁,完全规避CRAN的存储限制。
3. 临时文件持久化到测试会话周期
如果对象创建极耗时,可以将其保存为临时文件,在整个测试会话周期内复用,测试结束后自动删除:
# 同样放在 setup.R 里 temp_file <- tempfile(fileext = ".rds") # 创建并保存大对象 large_obj <- your_time_consuming_creation_function() saveRDS(large_obj, temp_file) # 测试会话结束后删除临时文件 on.exit(unlink(temp_file), add = TRUE) # 在测试文件中读取使用 large_obj <- readRDS(temp_file)
这种方式适合创建成本极高的对象,读取RDS文件通常比重新创建更快。
内容的提问来源于stack exchange,提问作者Pedro Victori
相关产品推荐
相关产品推荐

