testthat交互式运行与终端执行测试结果不一致问题咨询
R testthat 交互式环境与终端运行结果不一致问题
问题描述
- 使用R搭配testthat做单元测试时出现异常:完全相同的测试代码,在交互式R环境、终端环境下运行结果存在差异。
复现步骤
- 第一步:新建名为
example_funcs.R的文件,写入以下代码:
function_main <- function(df, avg_gear = NA) { function_main2(df, avg_gear) } function_main2 <- function(data_df, avg_gear) { data_df$car_name = row.names(data_df) get_avg_gear(data_df) } # 该函数缺失对应参数传递 get_avg_gear <- function(data_df) { data_df %>% filter(gear == avg_gear) }
- 第二步:新建名为
example.R的文件,写入以下代码:
library(dplyr) source("example_funcs.R") data_df = mtcars avg_gear = median(data_df$gear) test_that("example", { output = function_main(data_df, avg_gear = avg_gear) expect_true( all(output$gear == 4) ) })
不同场景运行结果
交互式R环境
在交互式R控制台执行如下命令:
testthat::test_file("example.R")
运行输出:
══ Testing example.R ═══════════════════════════════════════════════════════════════════════════════════════ [ FAIL 0 | WARN 0 | SKIP 0 | PASS 1 ] Done!
测试顺利通过。
RStudio GitBash终端
在终端执行如下命令:
Rscript -e ' testthat::test_file("example.R")'
运行输出:
══ Testing example.R ═══════════════════════════════════════════════════════════════════════════════════════════════════════════[ FAIL 1 | WARN 0 | SKIP 0 | PASS 0 ] ── Error (example.R:11:3): example ───────────────────────────────────────────── Error in `filter(., gear == avg_gear)`: Problem while computing `..1 = gear == avg_gear`. Caused by error: ! object 'avg_gear' not found Backtrace: 1. global function_main(data_df, avg_gear = avg_gear) at example.R:11:2 6. dplyr:::filter.data.frame(., gear == avg_gear) 7. dplyr:::filter_rows(.data, ..., caller_env = caller_env()) 8. dplyr:::filter_eval(dots, mask = mask, error_call = error_call) 10. mask$eval_all_filter(dots, env_filter) [ FAIL 1 | WARN 0 | SKIP 0 | PASS 0 ]
测试执行失败。
核心疑问
报错原因是get_avg_gear函数内未传入avg_gear参数,但按照R的词法作用域规则,变量查找逻辑应当是全局统一的:R会先在当前函数内部查找变量,之后沿函数定义所在环境逐级向上查找直到全局环境,最后在已加载的其他包中查找,理论上不应该出现两种环境下结果不一致的情况。
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

