Исходный файл R без его запуска (юнит-тестирование)
Мы создаем кодовую базу R и надеемся протестировать любые функции, которые мы напишем. На данный момент мы нашли две библиотеки тестирования для R: RUnit и testthat.
После небольшой песочницы мы разработали надежный метод тестирования кода при каждом его запуске. Например:
# sample.R
library(methods) #required for testthat
library(testthat)
print("Running fun()...")
fun <- function(num1, num2){
num3 = num1 + num2
return(num3)
}
expect_that(fun(1,2), equals(3))
Достаточно просто. Однако нам также хотелось бы иметь возможность протестировать функцию (например, с флагом unittest в make-файле) без запуска скрипта, в котором он определен. Для этого мы напишем unittests в test.R
# test.R
source("sample.R")
expect_that(fun(2,3), equals(5))
и запустить его, не запуская остальную часть образца. Но когда запускается приведенный выше код, будут запущены не только функции, но и остальной код из sample.R, в этом примере выдается "Running fun()...". Есть ли способ для source() только определенные пользователем функции из файла?
Если нет, вы бы порекомендовали поместить функции в отдельный файл (скажем, functions.R), который можно протестировать, используя источник в test.R, и запускать, когда он получен из sample.R? Недостаток, по-видимому, заключается в том, что необходим шаблон: файл для процесса, файл для функций и файл для запуска тестов.
2 ответа
В каждом сценарии задайте переменную имени, которая определяется, только если она еще не определена. Увидеть
exists()
, я очень люблю__name__
,Создайте главную функцию в каждом скрипте, которая запускается, только если имя верное. Эта функция содержит все, что вы хотите запустить, только если это скрипт верхнего уровня.
Это похоже на структуру Python
if __name__ == "__main__": main()
Я не понял, как реализовать ответ Уилла Бисона, но его упоминание о питоническом пути привело меня к следующему решению:
if (sys.nframe() == 0) {
# ... do main stuff
}
равно0
при запуске из интерактивного терминала или с помощьюRscript.exe
, и в этом случае запустится основной код. В противном случае, когда кодsource
д,sys.nframe()
равно4
(в моем случае, не уверен, как именно это работает), что предотвратит запуск основного кода.