Модульное тестирование вне пакета в R - PullRequest
2 голосов
/ 19 сентября 2019

Часто мы используем 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 используется во многих контекстах, где смысл сценария - это репликация в научном смысле, но там, где люди могут легко расширить возможности других сценариев, которые могут значительно расширить возможности сценария.выпущен как часть материалов репликации для новых проектов, что гораздо труднее сделать, особенно в сложном коде, когда нет тестов, а код может быть очень хрупким и давать сбой нетривиальным и тихим способами.

1 Ответ

1 голос
/ 19 сентября 2019

https://github.com/ropensci/assertr предоставляет среду, лучше подходящую для тестирования рабочих процессов анализа данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...