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

如何让testthat::expect_equal()输出更具实用性的结果?

解决testthat提示长度差异但不显示缺失项的问题

你可以通过两种方式让testthat输出更具体的缺失信息:

方法1:分步检查命名与值

先单独验证向量的命名完整性,再检查对应的值是否匹配,能直接明确显示缺失的命名项:

library(testthat)

test_that(
  'files are named correctly',
  {
    expected <- c(AMEREN1 = "AMEREN24.01.15_March-1_DM_RL.pdf", COMED1 = "COMED24.01.15_March-1_DM_RL.pdf", 
                  `MD-OTH1` = "MD-OTH24.01.15_March_DM_RL.pdf", MD1 = "MD24.01.15_March_DM_RL.pdf", 
                  NJ1 = "NJ24.01.15_March_DM_RL.pdf", OH1 = "OH24.01.15_March_DM_RL.pdf", 
                  PA1 = "PA24.01.15_March_DM_RL.pdf", AMEREN2 = "AMEREN24.01.15_March-2_DM_RL.pdf", 
                  COMED2 = "COMED24.01.15_March-2_DM_RL.pdf", `PA-DUQ2` = "PA24.01.15_March-DUQ_DM_RL.pdf", 
                  `PA-METED2` = "PA24.01.15_March-METED_DM_RL.pdf", `PA-PECO2` = "PA24.01.15_March-PECO_DM_RL.pdf", 
                  `PA-PENELEC2` = "PA24.01.15_March-PENELEC_DM_RL.pdf", `PA-PENN2` = "PA24.01.15_March-PENN_DM_RL.pdf", 
                  `PA-PPL2` = "PA24.01.15_March-PPL_DM_RL.pdf", `PA-WPP2` = "PA24.01.15_March-WPP_DM_RL.pdf"
    )
    actual <- c(AMEREN1 = "AMEREN24.01.15_March-1_DM_RL.pdf", COMED1 = "COMED24.01.15_March-1_DM_RL.pdf", 
                `MD-OTH1` = "MD-OTH24.01.15_March_DM_RL.pdf", MD1 = "MD24.01.15_March_DM_RL.pdf", 
                NJ1 = "NJ24.01.15_March_DM_RL.pdf", PA1 = "PA24.01.15_March_DM_RL.pdf", 
                AMEREN2 = "AMEREN24.01.15_March-2_DM_RL.pdf", COMED2 = "COMED24.01.15_March-2_DM_RL.pdf", 
                `PA-DUQ2` = "PA24.01.15_March-DUQ_DM_RL.pdf", `PA-METED2` = "PA24.01.15_March-METED_DM_RL.pdf", 
                `PA-PECO2` = "PA24.01.15_March-PECO_DM_RL.pdf", `PA-PENELEC2` = "PA24.01.15_March-PENELEC_DM_RL.pdf", 
                `PA-PENN2` = "PA24.01.15_March-PENN_DM_RL.pdf", `PA-WPP2` = "PA24.01.15_March-WPP_DM_RL.pdf"
    )
    
    # 先检查命名是否完全匹配
    expect_equal(names(actual), names(expected), 
                 info = sprintf("缺失的命名项: %s", paste(setdiff(names(expected), names(actual)), collapse = ", ")))
    # 再检查值是否匹配
    expect_equal(actual, expected)
  }
)

运行后会直接提示缺失的命名:

-- Failure (':27'): files are named correctly ----------------------------
names(actual) not equal to names(expected).
Lengths differ: 14 is not 16
Missing names in actual: "OH1", "PA-PPL2"
info: 缺失的命名项: OH1, PA-PPL2

方法2:使用waldo包增强对比

waldo包的对比功能比默认expect_equal更详细,能直接输出向量的差异细节:

library(testthat)
library(waldo)

test_that(
  'files are named correctly',
  {
    # expected和actual定义同之前代码
    expect_equal(actual, expected, compare = waldo::compare)
  }
)

运行后会输出包含缺失项的详细差异报告,比如:

actual not equal to expected.
- actual
+ expected
[5] "NJ24.01.15_March_DM_RL.pdf"
[6] "PA24.01.15_March_DM_RL.pdf"

  • [7] "OH24.01.15_March_DM_RL.pdf"
    [7] "AMEREN24.01.15_March-2_DM_RL.pdf"
    ...
  • Names: 14 total
  • Names: 16 total
  • Missing names: "OH1", "PA-PPL2"

内容的提问来源于stack exchange,提问作者joshbrows

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:31:24