我有一个使用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个测试中,我检查了每个plot对象都是不同的,即参数做了一些事情,所有这些都是彼此不同的。在我的例子中,由于我有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]]))其中v1和v2指的是以上各列中的整数。
发布于 2019-06-22 07:37:43
在您的特定情况下,我会说-无论您最终如何实现它们-这些测试几乎没有价值,它们的结果甚至可能是不值得信任的。
这些测试没有什么价值,因为如果它们通过了,您仍然会得到非常有限的信息:您将知道所有的热图看起来都不同(好的,也许见下文),但是您不知道它们看起来是否像您期望的那样。然而,尽管测试结果很弱,但测试可能需要很长时间,当添加额外的热图样式时,测试时间甚至会大大增加。
对于有限的信息,这些测试可能是不可信的:根据ggplot的工作方式,即使是看起来相同的热图也可能不一样,例如,如果工具向每个生成的热图添加了一些时间戳。即使该工具现在不能像这样工作,您可能也不能保证将来会这样。因此,即使您的测试通过了,一些图看起来仍然是一样的,但是比较起来并不相等。
当然,热图看起来是否像您希望的那样,这是您无法通过单元测试确定的。相反,您需要查看结果输出--这可能是最好归类为系统测试的测试。
https://stackoverflow.com/questions/56693190
复制相似问题