用testthat大规模测试唯一性

时间:2019-06-20 20:07:37

标签: r unit-testing testthat

我有一个使用testthat进行自动化测试的软件包。但是,我想知道当人们想要进行大量测试时的最佳实践是什么。一种常见的情况是,我正在测试所有参数/参数是否具有唯一性。这是一个不起作用的示例,可以给出一个想法:

# 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指的是以上各列中的整数。

1 个答案:

答案 0 :(得分:0)

在您的特定情况下,我想说-无论您最终如何实施它们-这些测试都没有什么价值,它们的结果甚至可能是不可信的。

这些测试没有什么价值,因为如果通过这些测试,您仍然会获得非常有限的信息:您将知道所有热图看起来都不同(嗯,也许,请参阅下文),但是您将不知道它们的外观如何希望他们看起来。但是,尽管结果不佳,该测试仍会花费大量时间,而当添加其他热图样式时,测试甚至会大大增加。

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

当然,通过单元测试无法确定热图是否看起来像您想要的那样。相反,您需要查看结果输出-最好将其归类为系统测试的测试。