【问题标题】:Mass testing of uniqueness with testthat使用 testthat 对唯一性进行大规模测试
【发布时间】:2019-11-03 16:47:57
【问题描述】:

我有一个使用 testthat 的自动化测试包。但是,我想知道当一个人想要进行大量测试时,最佳实践是什么。一种常见的情况是,我正在测试所有参数/pars 是否都做了一些独特的事情。这是一个提供想法的非功能示例:

# GG_heatmap --------------------------------------------------------------

#save plots to list
heatmaps = list(
  #various options
  default = mtcars[, c(1,3,4,5,6,7)] %>% GG_heatmap(),
  no_reorder = mtcars[, c(1,3,4,5,6,7)] %>% GG_heatmap(reorder_vars = F),
  no_values = mtcars[, c(1,3,4,5,6,7)] %>% GG_heatmap(add_values = F),
  many_digits = mtcars[, c(1,3,4,5,6,7)] %>% GG_heatmap(digits = 5)
)

test_that("GG_heatmap", {
  #check that plots work
  walk(heatmaps, ~expect_s3_class(., class = "ggplot"))

  #check for non-identity
  #cant think of an easy smart way to do this
  expect_true(!identical(heatmaps$default, heatmaps$no_reorder))
  expect_true(!identical(heatmaps$default, heatmaps$no_values))
  expect_true(!identical(heatmaps$default, heatmaps$many_digits))
  expect_true(!identical(heatmaps$no_reorder, heatmaps$no_values))
  expect_true(!identical(heatmaps$no_reorder, heatmaps$many_digits))
  expect_true(!identical(heatmaps$no_values, heatmaps$many_digits))
})

所以,有一个名为GG_heatmap()(即this one,稍作修改)的函数返回ggplot2 绘图。

walk()中,我们只检查类是否正确。我试过了,当类错误时它确实失败了,执行devtools::test()时的测试摘要是正确的,即它发现walk()调用运行4个测试,而不是1个。

在下面的 6 个测试中,我检查每个绘图对象是否不同,即参数做了一些事情,所有这些都彼此不同。就我而言,由于我有 4 个版本,我需要测试 6 个(即choose(4, 2))组合以确保它们都是唯一的。如果我有 10 个参数要测试,这将是很多手动代码要编写 (choose(10, 2) = 45)。

所以我的问题是,在进行这样的测试时,最佳做法是什么?是否有一种功能可以测试每个对象的唯一性?我能想到的最好的方法是循环输出:

> gtools::combinations(4, 2)
     [,1] [,2]
[1,]    1    2
[2,]    1    3
[3,]    1    4
[4,]    2    3
[5,]    2    4
[6,]    3    4

然后调用每一行:

expect_true(!identical(heatmaps[[v1]], heatmaps[[v2]]))

其中v1v2 指的是上列中的整数。

【问题讨论】:

  • 我认为您的建议没有问题。

标签: r unit-testing testthat


【解决方案1】:

在您的具体情况下,我会说 - 无论您最终如何实施它们 - 这些测试都没有什么价值,而且它们的结果甚至可能不值得信赖。

这些测试没有什么价值,因为如果它们通过了,您仍然会得到非常有限的信息:您会知道所有热图看起来都不同(嗯,也许,见下文),但您不会知道它们是否看起来像您期待他们看。然而,尽管结果很弱,但测试可能需要相当长的时间,当添加额外的热图样式时,时间甚至会大幅增长。

就其有限的信息而言,这些测试可能不可信:根据 ggplot 的工作方式,即使看起来相同的热图也可能无法比较,例如,如果该工具为每个生成的热图添加了一些时间戳。即使该工具今天不能像这样工作,您也可能无法保证将来会这样做。因此,即使您的测试通过了,一些图表仍可能看起来相同,但比较不相等。

热图是否看起来像您希望的那样,当然,您无法通过单元测试来弄清楚。相反,您需要查看结果输出 - 一个可能最好归类为系统测试的测试。

【讨论】:

  • 可以解构ggplots 的属性以查看它们是否具有正确的层等(使用ggplot_build(),参见stackoverflow.com/a/41940643/3980197),因此可以进行更精确的测试这种性质,但它需要更多的编码来设置。就我而言,只知道它们产生不同的结果对我来说就足够了(这是我的私人包裹,而不是很多 $$$ 取决于结果的东西)。
  • 我明白了 - 那么,如果性能对您来说也不是问题,我会说您的方法很好。如果性能在某个时间点成为问题,您可以考虑为每个图构建一些哈希值,而不是图的成对比较,而是比较哈希。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多