Часто мы используем R в тех случаях, когда мы хотим иметь воспроизводимость перед лицом изменений и когда у нас есть сложные базы кода, но вне написания пакета.Похоже, что testthat и другие тестирующие пакеты ориентированы на модульное тестирование кода пакета, что имеет смысл, поскольку это наиболее распространенный случай, когда вам нужно много тестировать, когда вы не полностью контролируете все данные, но я былинтересно, был ли хороший пакет или метод для модульного тестирования в R вне контекста написания пакета.
Например, много раз в контексте пакета вы тестируете что-то в форме:
foo <- function(bar){
# do something to bar
return(bar.outcome)
}
, и затем вы тестируете ожидаемый вывод из функции, чтовещи правильного типа, что есть правильная обработка ошибок.Таким образом, вы создаете каталог в своем пакете для тестов и пишете их там, а затем devtools может использовать load_all
и testthat
для их запуска и получения результатов.
Одна вещь, которую я хотел бы сделать, - запускать такие же тесты вне контекста пакета, например, в скрипте.Это важно, потому что большая часть R-кода, написанного в академических кругах, не обобщает многое для различных контекстов или данных без значительных трудностей, так что наличие пакета не имеет особого смысла, но в то же время модульное тестированиеупростить расширение кода в будущих пакетах.Это простой случай.
На самом деле, более сложный случай - это то, что вы редко делаете в пакетах, то есть тестирование формы, вида и состояния данных.Так, например, я часто читаю R-код, написанный в академических кругах, с комментариями вроде
data <- data %>% doSomething() #1023 rows
parameter_df <- // read file
print(parameter_df) # 5 columns
data <- data %>% doSomething(param = parameter_df)
lapply(df, class) #should be char, char, char, numeric, Date
Мне нравится идея, что «каждый раз, когда вы хотите написать оператор печати, вместо этого пишите тест», но я на самом деленет хорошей основы для того, как это должно быть сделано в R. Особенно в этом сложном случае, когда вы не тестируете функцию, вы проверяете, чтобы убедиться, что данные, проходящие через вашу программу, верны.
Контекст здесь заключается в том, что R используется во многих контекстах, где смысл сценария - это репликация в научном смысле, но там, где люди могут легко расширить возможности других сценариев, которые могут значительно расширить возможности сценария.выпущен как часть материалов репликации для новых проектов, что гораздо труднее сделать, особенно в сложном коде, когда нет тестов, а код может быть очень хрупким и давать сбой нетривиальным и тихим способами.