首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用testthat批量测试唯一性

使用testthat批量测试唯一性
EN

Stack Overflow用户
提问于 2019-06-21 04:07:37
回答 1查看 91关注 0票数 1

我有一个使用testthat进行自动化测试的包。然而,我想知道当一个人想要有很多测试时,最好的实践是什么。一种常见的情况是,我正在测试所有参数/解析器是否都做了一些独特的事情。下面是一个非函数式的例子来给出一个概念:

代码语言:javascript
复制
# 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个测试中,我检查了每个plot对象都是不同的,即参数做了一些事情,所有这些都是彼此不同的。在我的例子中,由于我有4个版本,我需要测试6个(即choose(4, 2))组合,以确保它们都是唯一的。假设我有10个参数要测试,这将需要编写大量的手动代码(choose(10, 2) = 45)。

所以我的问题是,在进行这样的测试时,最佳实践是什么?有没有一个函数可以测试每个对象的唯一性?我所能想到的最好的方法是循环遍历以下命令的输出:

代码语言:javascript
复制
> gtools::combinations(4, 2)
     [,1] [,2]
[1,]    1    2
[2,]    1    3
[3,]    1    4
[4,]    2    3
[5,]    2    4
[6,]    3    4

然后在每行上调用:

代码语言:javascript
复制
expect_true(!identical(heatmaps[[v1]], heatmaps[[v2]]))

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

EN

回答 1

Stack Overflow用户

发布于 2019-06-22 07:37:43

在您的特定情况下,我会说-无论您最终如何实现它们-这些测试几乎没有价值,它们的结果甚至可能是不值得信任的。

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

对于有限的信息,这些测试可能是不可信的:根据ggplot的工作方式,即使是看起来相同的热图也可能不一样,例如,如果工具向每个生成的热图添加了一些时间戳。即使该工具现在不能像这样工作,您可能也不能保证将来会这样。因此,即使您的测试通过了,一些图看起来仍然是一样的,但是比较起来并不相等。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56693190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档