Исходный файл 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 ответа

Решение
  1. В каждом сценарии задайте переменную имени, которая определяется, только если она еще не определена. Увидеть exists(), я очень люблю __name__,

  2. Создайте главную функцию в каждом скрипте, которая запускается, только если имя верное. Эта функция содержит все, что вы хотите запустить, только если это скрипт верхнего уровня.

Это похоже на структуру Python

if __name__ == "__main__": main()

Я не понял, как реализовать ответ Уилла Бисона, но его упоминание о питоническом пути привело меня к следующему решению:

      if (sys.nframe() == 0) {
    # ... do main stuff
}

равно0при запуске из интерактивного терминала или с помощьюRscript.exe, и в этом случае запустится основной код. В противном случае, когда кодsourceд,sys.nframe()равно4(в моем случае, не уверен, как именно это работает), что предотвратит запуск основного кода.

источник

Другие вопросы по тегам