Массовое тестирование уникальности с тестом - PullRequest
1 голос
/ 20 июня 2019

У меня есть пакет с автоматизированными тестами с использованием 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 относятся к целым числамв столбцах выше.

1 Ответ

0 голосов
/ 22 июня 2019

В вашем конкретном случае я бы сказал, что - независимо от того, как вы в конечном итоге их реализуете - эти тесты имеют небольшую ценность, и их результаты могут даже не заслуживать доверия.

Тесты имеют небольшую ценность, потому что если они пройдут, у вас все равно будет очень ограниченная информация: вы будете знать, что все тепловые карты выглядят по-разному (ну, может быть, смотрите ниже), но вы не будете знать, выглядят ли они так, как вы ожидайте, что они будут смотреть. Однако, несмотря на слабый результат, тест, вероятно, займет значительное время, которое даже сильно возрастет, когда будут добавлены дополнительные стили тепловых карт.

Тесты могут быть ненадежными в отношении их ограниченной информации: в зависимости от того, как работает ggplot, даже одинаково выглядящие тепловые карты могут не совпадать, например, если инструмент добавляет некоторую временную отметку к каждой сгенерированной тепловой карте. Даже если инструмент не работает сегодня, у вас, вероятно, нет гарантии на будущее. Таким образом, даже если ваши тесты пройдут, некоторые диаграммы могут все же выглядеть одинаково, но сравниваться неравномерно.

Независимо от того, выглядят ли тепловые карты так, как вы хотите, чтобы они выглядели, вы, конечно, не можете понять с помощью модульного тестирования. Вместо этого вам нужно взглянуть на полученный результат - тест, который, вероятно, лучше всего классифицировать как системный тест.

...