У меня есть пакет с автоматизированными тестами с использованием 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()
(которая эта , немного измененная), которая возвращает ggplot2
plot.
В 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]]))
, где v1
и v2
относятся к целым числамв столбцах выше.